1

有时 Cocoa 允许用户将 NSOperationQueue 或 dispath_queue_t 传递给 async 方法:

+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
-[AVPlayer addBoundaryTimeObserverForTimes:queue:usingBlock:]
-[NSNotificationCenter addObserverForName:object:queue:usingBlock:]

有时不会:

-[NSDocument continueActivityUsingBlock:]
-[NSSavePanel beginWithCompletionHandler:]
-[GKAchievementDescription loadImageWithCompletionHandler:]

对我来说,将队列传递给方法看起来很模糊,因为在创建块时总是可以捕获所需的队列。例如:

NSOperationQueue *q = …;
[aDocument continueActivityUsingBlock:^{
    [q addOperationWithBlock:^{
        // Do actual work here.
    }];
}];

也许我错过了一些东西并且通过队列是有意义的?

4

1 回答 1

4

要看。

完成时需要回调吗?

如果是这样,您可能需要指定一个队列。类型——NSOperationQueue 与 GCD 队列——取决于你。

但是,如果您将回调定义为始终在主队列上调用(这适用于始终广泛更新 UI 的回调始终异步调用(即回调被分派到异步队列,通常),没有理由传递目标队列。

如果您的回调是一个期望它可能与必须序列化操作的数据交互的回调,那么定义一个提供序列化原语(队列)的 API 可能是一个强大的快捷方式。

于 2012-10-28T04:59:56.270 回答