dispatch_get_global_queue vs dispatch_get_main_queue

开始了解核心数据和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。

dispatch_get_global_queue您提供一个后台队列,您可以在其中分派asynchronous运行的后台任务(即不会阻塞您的用户界面)。 如果最终将多个块提交给全局队列,这些作业可以同时运行。 如果你有多个代码块要提交给一个后台队列,你必须在后台顺序运行(不经常需要),你可以创build自己的串行后台队列并调度到这个队列,但是如果并发的后台操作是那么利用dispatch_get_global_queue方便/有效。

但请注意,您不允许在后台队列中执行用户界面更新,因此dispatch_asyncdispatch_get_main_queue在主队列可用时让后台队列将用户界面更新分派回主队列。

这是一个非常常见的编程模式:提交一些东西在后台运行,当它需要执行用户更新时,将更新发送回主队列。

有关更多信息,请参阅并发编程指南 。

dispatch_get_main_queue应该在您想要操作UI元素的任何时候使用。 这与线程关联有关,这是UI框架的通用模型。 线程关联意味着您只能操作创build该对象的线程上的对象。 对于Cocoa Touch中的UI类,这是主线程。 在所有重要的平台上,这是一个典型的UI框架

所以dispatch_get_main_queue获得与主线程关联的队列。 不这样做会导致奇怪的事情发生时,你的用户界面更新在不同的线程。 我通常会看到UI冻结的地方。

dispatch_get_global_queue获取与您的应用关联的给定优先级的旧队列。 完美的networking电话,或者,在你的情况下,使用核心数据。

全局队列为您提供了一个不同于主队列的队列,但是可以节省您实际创build自己的队列的麻烦。 当你需要你的代码在主队列上工作时(你所有的UI工作需要发生的地方)使用get_main_queue,

 **dispatch_get_main_queue** :- Perform UI updates on this queue dispatch_async(dispatch_get_main_queue(), ^{ self.label.text=@"Hello"; }); **dispatch_get_main_queue**:- Perform background tasks like downloading content dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ for (int i=0; i<100000;enter code here i++) { NSLog(@"HIGH 1 %d", i); } }); 
Interesting Posts