我有一个相当慢的drawRect方法(100-200ms)。为了节省时间,我需要缓存结果。我正在做这样的实际缓存:
// 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,所以它必须在主线程上。
不是像这样任意拖延,而是有防弹的方式来等待?
最佳答案
缓存本身不必在主线程上完成。您可以获取图像上下文或位图数据的副本/引用,并仅在渲染完成后使用NSThread启动它。例:
- (void) drawRect:(CGRect)rect {
do_rendering_here();
// when rendering completed:
NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(doCaching:) object:c];
[t start];
[t release];
}
- (void) doCaching:(CGContextRef)ctx {
// do whatever kind of caching is needed
}