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_async
的dispatch_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); } });