考虑以下代码:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
UIGraphicsBeginImageContext(self.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
//perform some drawing into this context
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_sync(dispatch_get_main_queue(), ^{
self.imageView.image=viewImage;
});
});
为什么在使用例程的结果更新对象之前必须在最后获取主队列?为什么不在队列queue
内更新?
答案 0 :(得分:3)
任何触及GUI的东西都必须在主线程上。 (要在主线程上运行的主调度队列is guaranteed。)Cocoa / Cocoa Touch的那部分不是线程安全的。
请参阅线程编程指南中的"Threads and Your User Interface":
...建议您从应用程序的主线程接收与用户相关的事件并启动界面更新。 [...]某些框架,例如Cocoa,通常需要这种行为......
图像视图是GUI的一部分,因此您只需要在主线程上设置其属性。
例如,如果要更新数组,则不需要在主线程上执行此操作(您只需要注意读取或其他同时发生的写操作)。