我应该为异步方法使用什么签名?

时间:2012-10-28 04:45:03

标签: objective-c cocoa grand-central-dispatch

有时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.
    }];
}];

也许我错过了什么,传递队列是否合理?

1 个答案:

答案 0 :(得分:4)

取决于

完成后你需要回电吗?

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

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

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