2

前もって感謝します。

Quartz Composerビュー(以下のqcView)があり、QCViewの中央に「ホーム」があることがわかるまで、画像(コードについて疑問がある場合は、アリの画像)をランダムな方向に移動します。アリが1インチずつ動くのを見るには、pauseRenderingが必要です。それがなければ、アリはその「家」に現れるでしょう。

while([self distance] > acceptableOffset){
    [qcView pauseRendering];
    [self moveTowardsDestination:@"home"];
    [qcView resumeRendering];
}

これは、1匹のアリにとっては完全にうまく機能します。

方程式に別のアリを追加するときは、ディスパッチキューと2つのブロックを使用します。

    dispatch_async(queue, ^{
        [theAnt findCenter];
    });

    dispatch_async(queue, ^{
        [otherAnt findCenter];
    });

このコードが実行されると、2人の叔母は同時に自宅に急いで行きます-私たちが探している正確な行動です。ただし、実行を停止して再度ビルドすると、[qcViewpauseRendering]メソッド内のどこかからすぐにExc_Bad_Accessを取得します。Clean&Buildの後、もう1回実行すると完全に機能します。pauseRenderingとresumeRenderingを削除すると、アリはすぐに自宅に現れます。

どうやら、QCView pauseRenderingメソッドにローカルな配列があり、それは絶えず拡大および縮小しており、単一のQCViewとそれにアクセスする複数のブロックを使用すると、問題の根本を確認できます。

QCViewのドキュメントを調べましたが、そこからインスピレーションを得られないようです。pauseRenderingに関するドキュメントは最小限です。誰もこれほどばかげたことを試したことはないと思いますが、誰かがQCViewを実際に変更した経験があり、私を正しい方向に向けることができることを願っています(エラー...「ANY!」を読んでください)。 。

[編集:「while(![qcView isPausedRendering])」のバリエーションを試しましたが、それが役立つ場合は。]

4

2 に答える 2

2

QCViewインスタンスが実際に同時実行をサポートしていることを確認しますか?

可能性は非常に低いです。別々のスレッドまたはキューからのビューをいじくり回している場合(バックグラウンドのキュー/スレッドからのビューを同時に使用していない場合でも)、QCViewの同時実行ルールに違反している可能性があります。

メインスレッドから、または少なくとも一度に1つのスレッドからビューを操作する必要があると思います。

(残念ながら、これに関する具体的な情報は見つかりませんでした)。

于 2011-02-06T00:23:17.983 に答える
1

解決しました。

私は問題を非常に過大評価していたことがわかりました。使用の簡単な修正

     usleep(10000);

図に行きます。

これは元々コードに含まれていましたが、dispatch_suspend()に置き換えられました。一時停止の直前にライン上でスリープすると、目的のアクティビティが達成されます。

誰かが同様の問題に遭遇した場合は、遠慮なく私にメールしてください。

于 2011-02-06T02:26:16.893 に答える