菜鸟教程小白 发表于 2022-12-13 03:32:43

ios - NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 上下文的并发?


                                            <p><p>使用 NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 初始化的托管对象上下文与主队列和私有(private)队列相关联,它们是串行队列,操作按 FIFO 顺序执行。</p>

<p>下面的示例代码:</p>

<pre><code>NSLog(@&#34;Current thread : %@&#34;, );

[mainMoc performBlock:^{
    NSLog(@&#34;main 1 - %@&#34;, );

}];

[mainMoc performBlockAndWait:^{
    NSLog(@&#34;main 2 - %@&#34;, );

}];

[mainMoc performBlock:^{
    NSLog(@&#34;main 3 - %@&#34;, );

}];

[bgMoc performBlock:^{
    NSLog(@&#34;bg 1 - %@&#34;, );

}];

[bgMoc performBlockAndWait:^{
    NSLog(@&#34;bg 2 - %@&#34;, );

}];

[bgMoc performBlock:^{
    NSLog(@&#34;bg 3 - %@&#34;, );

}];
</code></pre>

<p>我期待它打印出来</p>

<p><code>main 1</code>、<code>main 2</code> 和 <code>main 3</code> 类似 <code>bg 1</code>、<code>bg 2</code> 和 <code>bg 3</code> 以串行顺序排列,但这是打印出来的:</p>

<pre><code>Current thread : &lt;NSThread: 0x60000006fb80&gt;{number = 1, name = main}
main 2 - &lt;NSThread: 0x60000006fb80&gt;{number = 1, name = main}
bg 1 - &lt;NSThread: 0x600000268900&gt;{number = 3, name = (null)}
bg 2 - &lt;NSThread: 0x60000006fb80&gt;{number = 1, name = main}
bg 3 - &lt;NSThread: 0x600000268900&gt;{number = 3, name = (null)}
main 1 - &lt;NSThread: 0x60000006fb80&gt;{number = 1, name = main}
main 3 - &lt;NSThread: 0x60000006fb80&gt;{number = 1, name = main}
</code></pre>

<p>考虑到主队列和私有(private)队列都是串行的,它背后的理论是什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>并发是不确定的。您唯一可以保证的是“main1”在“main3”之前执行,因为正如您所说,它是一个 FIFO 队列。</p>

<p>区分 <code>performBlock</code> 和 <code>performBlockAndWait</code> 很重要。 </p>

<p><code>performBlock</code> 是异步的,所以它只是将 block 放入队列并立即返回。这些 block 将按顺序执行。这就是为什么“main1”总是在“main3”之前执行。</p>

<p><code>performBlockAndWait</code> 是同步的,因此不能按照定义处理队列。这意味着它将立即执行该 block ,并且在完成之前不会返回。
如果它不这样做,它会阻塞,因为队列不是空的,否则它必须先执行队列中的所有其他任务。</p>

<p>现在“bg1”出现在“bg2”之前的原因是调度。我几乎可以肯定,如果你多次执行这个测试,它最终可能会有所不同。
如果主线程更快地到达同步的“bg2”,它将首先出现。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 上下文的并发?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47588925/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47588925/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSMainQueueConcurrencyType 和 NSPrivateQueueConcurrencyType 上下文的并发?