0

考虑这段代码:

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

4

1 回答 1

3

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

请参阅线程编程指南中的“线程和您的用户界面” :

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

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

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

于 2012-08-11T07:52:26.467 回答