【发布时间】:2012-02-01 21:39:08
【问题描述】:
我有一个相当慢(100-200 毫秒)的 drawRect 方法。为了节省时间,我需要缓存结果。我正在做这样的实际缓存:
// some code to check if caching would be desirable goes here. If it is desirable, then
UIGraphicsBeginImageContext(viewSize);
CGContextRef c = UIGraphicsGetCurrentContext();
[view.layer renderInContext: c];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
[self.cachedImageArray addObject:image];
UIGraphicsEndImageContext();
缓存本身最多可能需要 40 毫秒。这仍然很值得。但是缓存必须等到所有内容都渲染完毕,否则会出错。此外,缓存是一个低优先级的任务。一旦所有的东西都显示出来了,其他的事情可能还在继续,如果是这样,缓存可以等待。但由于它使用 UIKit,它必须在主线程上。
与其随意拖延,有没有一种防弹的方法可以像这样等待?
【问题讨论】:
-
为什么缓存任务必须在主线程上?难道你不能在主线程上发送(或显示)结果(通过
performSelectorOnMainThread或GCD 的魔法dispatch_async(dispatch_get_main_queue(), ^{ });并在drawRect末尾附近的单独线程上分离缓存吗? -
从 iOS 4 开始,绘制到图形上下文是线程安全的,不必在主线程上执行。您可以使用
dispatch_async()将整个事情踢到后台线程。
标签: iphone ios caching uiimage image-caching