对象只存在于创建它们的调度队列中吗?

时间:2012-08-11 07:48:13

标签: objective-c grand-central-dispatch

考虑以下代码:

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内更新?

1 个答案:

答案 0 :(得分:3)

任何触及GUI的东西都必须在主线程上。 (要在主线程上运行的主调度队列is guaranteed。)Cocoa / Cocoa Touch的那部分不是线程安全的。

请参阅线程编程指南中的"Threads and Your User Interface"

  

...建议您从应用程序的主线程接收与用户相关的事件并启动界面更新。 [...]某些框架,例如Cocoa,通常需要这种行为......

图像视图是GUI的一部分,因此您只需要在主线程上设置其属性。

例如,如果要更新数组,则不需要在主线程上执行此操作(您只需要注意读取或其他同时发生的写操作)。