コア グラフィックスの処理が完了するまで、コア アニメーションを停止する方法を探しています。いくつかの方法を試しましたが、何もうまくいかないようです。
背景: やらなければならない Core-Graphics の描画がたくさんあります。すべての処理は ImageContext で行われるため、画像を同時にレンダリングし、処理が完了したら、layer.content
(メイン スレッドで) 結果の画像に適切な を設定します。私が抱えている問題は、画像の処理が完了する前に現在の実行ループが終了し、アニメーション中に適切なビューの背景がすべて配置されていない (多くの場合、黒い背景が表示される) コアアニメーションが開始されることが多いことです。すべての同時画像処理が完了するまでコア アニメーションを停止する方法が必要です。
また、多くの「スタンプ」も行います。結果の画像をキャッシュして返すことで、不要な処理を実行する必要がなくなります。ビューごとにコアグラフィックスを再処理したくないので、これは使用[CALayer drawInContext:]
と設定を除外すると思います。drawsAsynchronously = YES;
これが私が試したことです:
performSelector
処理が完了するまで「待機」(空の を実行) するメソッドを使用しようとしましたが、セレクターをすぐに実行する (早すぎる) か、次の実行ループで(遅すぎるwhile loop
) しか実行できません。delay
.- メインの実行ループにオブザーバーを追加してみました:
コード:
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(NULL, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
[[Themes class] performSelectorOnMainThread:@selector(waitOnDraw) withObject:nil waitUntilDone:YES modes:Array(NSRunLoopCommonModes)];
});
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
注:kCFRunLoopAllActivities
やり過ぎですが、他のモードはどれも機能していませんでした。私の基礎をすべてカバーしようとしているだけです。
コアアニメーションが実行されているスレッドにアクセスできれば、直接停止できるかもしれませんが、そのスレッドにアクセスする方法がわかりません。
それだけです... 他に方法が思い浮かびません。
どんな助けでも大歓迎です。
注:すべての処理をメイン スレッドで実行できることはわかっていますが、できるだけ多くのパフォーマンスを向上させたいと考えています。コア グラフィックス コードを同時に処理することで、新しいデバイスでの処理速度が大幅に向上します。