有时Cocoa允许用户将NSOperationQueue或dispath_queue_t传递给异步方法:
+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
-[AVPlayer addBoundaryTimeObserverForTimes:queue:usingBlock:]
-[NSNotificationCenter addObserverForName:object:queue:usingBlock:]
有时候没有:
-[NSDocument continueActivityUsingBlock:]
-[NSSavePanel beginWithCompletionHandler:]
-[GKAchievementDescription loadImageWithCompletionHandler:]
对我来说,将队列传递给方法看起来很模糊,因为在创建块时总是可以捕获所需的队列。 E.g:
NSOperationQueue *q = …;
[aDocument continueActivityUsingBlock:^{
[q addOperationWithBlock:^{
// Do actual work here.
}];
}];
也许我错过了什么,传递队列是否合理?
答案 0 :(得分:4)
取决于
完成后你需要回电吗?
如果是这样,可能需要指定一个队列。类型 - NSOperationQueue与GCD队列 - 取决于您。
但是,如果您将回调定义为在主队列上调用始终(这适用于总是的回调将广泛更新UI )或总是将异步调用(即通常将回调调度到异步队列),没有理由通过目标队列。
如果您的回调是期望它可能与必须序列化操作的数据交互的回调,那么定义提供序列化原语的API - 队列 - 可以是一个强大的快捷方式。