开始学习核心数据和异步调度.有一段代码可以从数据集中获取图像的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_get_main_queue.

推荐答案

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

不过,请注意,您不允许在后台队列中执行用户界面更新,因此dispatch_asyncdispatch_get_main_queue(即Swift中的DispatchQueue.main.async { ... })允许后台队列在主队列可用时将用户界面更新发送回主队列.

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

有关更多信息,请参阅Concurrency Programming Guide.

Objective-c相关问答推荐

使用 NSMutableString 附加到文件的末尾

NSMutableDictionary 的深层可变副本

Objective C 中的 RSA 实现

如何使 UIView 动画序列重复和自动反转

ARC下归零弱引用的集合

如何将 CGPoint 添加到 NSMutableArray?

如果用户点击屏幕键盘,我如何关闭键盘?

如何正确获取文件大小并将其转换为 Cocoa 中的 MB、GB?

如何调整 UIModalPresentationFormSheet 的大小?

如何对包含数字的 NSMutable 数组进行排序?

在 Objective C 中,你能判断一个对象是否具有特定的属性或消息吗?

如何在 Objective-C 中将 NSString 解析为 BOOL?

在 NSArray 中查找最大数值

显示启动画面的时间超过默认秒数

#ifdef DEBUG 与 #if DEBUG

UITextField:键盘出现 timeshift 动视图

如何从 UIGestureRecognizer 获取 UITouch 位置

如何查看 NSError?

UIScrollView - 显示滚动条

`[super viewDidLoad]` 约定