首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dispatch_get_global_queue vs dispatch_get_main_queue

dispatch_get_global_queue vs dispatch_get_main_queue
EN

Stack Overflow用户
提问于 2012-10-02 23:16:35
回答 5查看 58.8K关注 0票数 45

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

代码语言:javascript
复制
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。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-02 23:28:51

dispatch_get_global_queue (Swift中的DispatchQueue.global())为您提供了一个后台队列,您可以在该队列上分派异步运行的后台任务(即不会阻塞您的用户界面)。如果您最终将多个块提交到全局队列,则这些作业可以并发操作。如果您希望将多个代码块提交到后台队列,而这些代码块必须在后台顺序运行(通常不需要),则可以创建自己的串行后台队列并将其分派到该队列,但如果并发后台操作是可接受的,则使用dispatch_get_global_queue是方便/高效的。

不过,请注意,您不允许在后台队列中执行用户界面更新,因此,一旦主队列可用,dispatch_get_main_queuedispatch_async (即Swift中的DispatchQueue.main.async { ... } )就会让后台队列将用户界面更新分派回主队列。

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

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

票数 91
EN

Stack Overflow用户

发布于 2012-10-02 23:25:59

只要您想要操作UI元素,就应该使用dispatch_get_main_queue。这与线程亲和性有关,这是一种常见的UI框架模型。线程关联意味着您只能在创建该对象的线程上操作该对象。对于Cocoa Touch中的UI类,这是主线程。这是所有重要平台上的UI框架的典型习惯用法。

因此,dispatch_get_main_queue获取与主线程相关联的队列。如果不这样做,当您的UI在不同的线程上更新时,会发生奇怪的事情。我通常在UI冻结的地方看到长时间的停顿。

dispatch_get_global_queue获取与你的应用程序相关联的给定优先级的任何旧队列。非常适合网络呼叫,或者像您的情况一样,使用核心数据。

票数 15
EN

Stack Overflow用户

发布于 2012-10-02 23:19:11

全局队列为您提供了一个不同于主que的队列,但省去了实际创建自己的队列的麻烦。当你需要你的代码在主队列上工作时使用get_main_queue (所有的UI工作都需要在主队列上进行)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12693197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档