2

コア グラフィックスの処理が完了するまで、コア アニメーションを停止する方法を探しています。いくつかの方法を試しましたが、何もうまくいかないようです。

背景: やらなければならない 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やり過ぎですが、他のモードはどれも機能していませんでした。私の基礎をすべてカバーしようとしているだけです。

コアアニメーションが実行されているスレッドにアクセスできれば、直接停止できるかもしれませんが、そのスレッドにアクセスする方法がわかりません。

それだけです... 他に方法が思い浮かびません。

どんな助けでも大歓迎です。

注:すべての処理をメイン スレッドで実行できることはわかっていますが、できるだけ多くのパフォーマンスを向上させたいと考えています。コア グラフィックス コードを同時に処理することで、新しいデバイスでの処理速度が大幅に向上します。

4

0 に答える 0