4

かなり遅い(100-200ms)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();

キャッシング自体は最大40msかかる場合があります。これはまだ簡単に価値があります。ただし、キャッシングはすべてがレンダリングされるまで待機する必要があります。そうしないと、問題が発生します。さらに、キャッシングは優先度の低いタスクです。すべてが表示された後も、他の​​ことが進行している可能性があります。その場合、キャッシュは待機できます。ただし、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 に答える