gpt4 book ai didi

iphone - NSBlockOperation 和启动方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:24 28 4
gpt4 key购买 nike

在检查我的代码时,我发现在很多地方我都假设调用 [NSBlockOperationInstance start]; 将在主线程上启动此操作。我不知道我为什么这么想,但无论如何我都不应该这么确定。我检查了文档,但找不到任何明确提及该 block 将在其上运行的线程。然而,断言 assert([NSThread isMainThread]); 在 block 的主体中​​确实每次使用 start 都会通过,所以我不确定这是否是巧合.有人对它的工作原理有更深入的了解吗?

我忘了提到 [op start] 正在主线程上调用。

最佳答案

好的,这完全取决于您调用 start() 的位置。虽然 NSBlockOperation 会将 block 外包给其他线程,但 start() 是同步的,并且在分配给 NSBlockOperation 的所有 block 都完成之前不会返回。

虽然 NSBlockOperation 将并发执行给定的 block ,但 NSBlockOperation 本身不是并发的(即 isConcurrent 为 false)。因此,根据文档,start() 将在调用 start() 的线程中完整执行。

由于调用 start() 的线程在所有 block 都执行完后才会返回,因此让调用线程参与到正在执行并发 block 的线程池中是有意义的。这就是为什么您会看到一些 block 在调用 start() 的线程中执行。

如果您看到一个 block 在主线程中执行,那么您一定是从主线程调用了它。

相关说明,如果您的 NSBlockOperation 包含单个 block ,那么该 block 将始终在调用线程中执行。

请记住,如果您希望 NSOperation 完全并发,则必须在子类中实现适当的功能。

除此之外,您可以将任何 NSOperation 赋给 NSOperationQueue,它会并发执行,因为 NSOperation 赋给了一个队列,运行该操作的线程调用了 start()。

就我个人而言,我看不出使用 NSBlockOperation 比 dispatch_async() 有任何优势,除非我需要使用它的特性。如果您只执行一个 block ,只需调用

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ });

如果你想利用 NSBlockOperation 的特性,但又不想在当前调用线程中等待它们完成,这样做仍然有意义......

// Add lots of concurrent blocks
[op addExecutionBlock:^{ /*whatever*/ }];
// Execute the blocks asynchronously
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[op start];
// Now do what you want after all the concurrent blocks have completed...
// Maybe even tell the UI
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI now that all my concurrent blocks have finished.
});
});

编辑解决您对 tc 的回答的评论...

如果你打电话

op = [NSBlockOperation blockOperationWithBlock:^{assert([NSThread isMainThread])}];
[op start];

从主线程,然后有一些保证,一些高概率。

首先,您可以保证 [op start] 将在调用线程中运行直至完成。这是因为 NSBlockOperation 不会覆盖 NSOperation 的默认行为,即指定它不是并发操作。

接下来,如果 NSBlockOperation 只有一个 block ,您很有可能会在调用线程中运行。第一个 block 在调用线程中运行的概率几乎相同。

但是,上面的“概率”并不是保证(只是因为文档没有说)。我想,一些工程师可能会找到一些理由将该单个 block 旋转到一个并发队列,并且只是让调用线程加入另一个线程中正在执行的操作......但我非常怀疑这一点。

无论如何,也许您的困惑来自于 NSBlockOperation 的文档说它并发执行 block ,而事实确实如此。但是,操作本身不是并发的,所以初始操作是同步的。它将等待所有 block 执行,并且它可能(或可能不)在调用线程上执行其中的一些 block 。

虽然不能保证,但我发现只有一个 block 的 NSBlockOperation 除了在调用线程上执行之外,极不可能做任何事情。

关于iphone - NSBlockOperation 和启动方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589451/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com