2012-10-28 51 views
1

有时可可允许用户无论是NSOperationQueue或dispath_queue_t传递给异步方法:我应该为异步方法使用什么签名?

+[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

取决于。

完成后需要回调吗?

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

但是,如果你定义你的回调为任何总是被主队列(这将是适当的回调是总是要更新大量的用户界面),或者是调用总是将是异步调用(即通常将回调调度到异步队列中),那么没有理由通过目标队列。

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

+0

谢谢。我现在清楚地看到,那些需要队列的方法可以按顺序执行传递块。 – Kentzo

相关问题