4

我有一个相当慢(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,它必须在主线程上。

与其随意拖延,有没有一种防弹的方法可以像这样等待?

4

1 回答 1

1

缓存本身不必在主线程上完成。您可以获得图像上下文或位图数据的副本/引用,并仅在渲染完成后使用 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
}
于 2012-01-03T22:33:13.943 回答