dispatch_get_global_queue vs dispatch_get_main_queue

时间:2012-10-02 15:16:35

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

开始了解核心数据和dispatch_async。有一段代码可以从数据集中获取图像的url并将其设置为核心数据模型,如下所示

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                NSString *urlString = [[[photoDictionary valueForKey:@"images"] objectAtIndex:0] valueForKey:@"url"];
                NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [photoModel setValue:imageData forKey:@"photoImageData"];

有人可以向我解释为什么我们使用dispatch_get_global_queue作为外部dispatch_async而使用dispatch_get_main_queue作为内部dispatch_async。

5 个答案:

答案 0 :(得分:84)

dispatch_get_global_queue会为您提供一个后台队列,您可以在其上调度异步运行的后台任务(即不会阻止您的用户界面)。如果您最终向全局队列提交多个块,则这些作业可以同时运行。如果您有多个代码块要提交到后台必须在后台运行的后台队列(通常不需要),您可以创建自己的串行后台队列并调度到该队列,但是如果并发后台操作是可以接受,然后利用dispatch_get_global_queue方便/高效。

请注意,您不允许在后台队列中执行用户界面更新,因此dispatch_async dispatch_get_main_queue允许后台队列将用户界面更新重新发送回主队列,一旦主队列可用。

这是一种非常常见的编程模式:提交在后台运行的内容以及何时需要执行用户更新,将更新分发回主队列。

有关详细信息,请参阅Concurrency Programming Guide

答案 1 :(得分:14)

每当您想要操纵UI元素时,都应该使用dispatch_get_main_queue。这与线程关联性有关,线程关联性是UI框架的通用模型。线程关联意味着您只能操作创建该对象的线程上的对象。对于Cocoa Touch中的UI类,这是主线程。这是所有重要平台上的UI框架的典型习惯。

因此dispatch_get_main_queue获取与主线程关联的队列。当你的UI在不同的线程上更新时,不这样做会导致奇怪的事情发生。我通常会看到UI暂停的长时间停顿。

dispatch_get_global_queue获取与您的应用相关联的给定优先级的任何旧队列。非常适合网络呼叫,或者像在您的情况下使用Core Data一样。

答案 2 :(得分:9)

全局队列为您提供了除主要que之外的队列,但为您节省了实际创建自己的队列的麻烦。当您需要代码在主队列上工作时(需要执行所有UI工作),请使用get_main_queue

答案 3 :(得分:2)

npm install bson@1.0.3

答案 4 :(得分:0)

简而言之,dispatch_get_global_queue 用于执行后台任务。但是当你在后台执行任何任务,然后如果你需要执行任何与user interface相关的任务时,你需要在dispatch_get_main_queue()

中完成