私はかなり遅い(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を使用するので、それはメインスレッド上になければなりません。
何らかの遅延を入れているのではなく、このように待機する防弾方法はありますか?
なぜキャッシュタスクはメインスレッド上になければならないのですか?結果をメインスレッド( 'performSelectorOnMainThread'またはGCDのmagic' dispatch_async(dispatch_get_main_queue()、^ {})経由で)に送信(または表示)できませんでしたか?あなたの 'drawRect'? –
グラフィックスコンテキストへの描画は、iOS 4のようにスレッドセーフであり、メインスレッド上で実行する必要はありません。' dispatch_async() 'を使ってバックグラウンドスレッドにこの全部をキックすることができます。 –