【发布时间】:2012-07-06 04:22:40
【问题描述】:
我知道只要我调用任何线程都是安全的
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
UIGraphicsEndImageContext();
在同一个线程上。
通过这种方法截取一个视图大约需要 300 毫秒,这还不错,但我的情况很紧张,所以我想在后台线程中进行。
这就是我正在做的事情:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
});
这里唯一有问题的是view,它位于主线程上。从后台线程在view.layer 上调用renderInContext 是否安全?或者一般来说,从另一个线程只读 UIKit 对象是否安全?
(请不要给我默认的“UIKit 不是线程安全”的答案。我已经知道了。这是一个特殊情况(不要告诉我没有特殊情况)。)
(上面的代码运行良好,但我不确定这是否只是巧合。)
【问题讨论】:
-
我认为您不会得到这个问题的明确答案,因为除了
UIKit is is not thread safe(以及列出的例外情况),Apple 不会在文档中说明任何其他内容。你会得到来自其他人的意见和经验,但正如你所说,上面的代码工作正常,但谁能说它总是会,即使别人告诉你它会,会吗? -
线程规则是否也适用于修改或读取对象?
-
如果我之前制作了视图的副本,那么我确定我是唯一可以访问这个新副本的方法吗?
标签: iphone objective-c ios core-graphics