1

ターン間のアニメーションを含む iPhone 用のターン ベースのゲームを作成しています。[UIView animateWithDuration:...] メソッドのインライン コード呼び出しを待ちたいと思います。この呼び出しを非同期ではなく同期的に行う方法はありますか? 現在、私がしていることは...

// Some code... 

NSConditionLock *conditionLock = [[NSConditionLock alloc] initWithCondition:0];

dispatch_sync(dispatch_get_main_queue(), ^{
    [UIView animateWithDuration:1 
                     animations:^{
                         // some animation
                     } 
                     completion:^(BOOL finished){
                         [conditionLock lock];
                         [conditionLock unlockWithCondition:1]; 
                     }]; 
});


// forces thread to wait until completion block is called
[conditionLock lockWhenCondition:1]; 


// More code... 

したがって、上記のコードでは、アニメーションが完全に終了した後にのみ「// More code...」に到達します。明らかに、このコードはセカンダリ スレッドで実行する必要があり、希望どおりに動作します。ただし、NSConditionLock を gcd と組み合わせて使用​​するのは悪い形式であり、この方法でセカンダリ スレッドをブロックすることはパフォーマンスにとって最適ではないと感じています。私の現在のコードは大丈夫ですか、それともこれを行うためのより良い方法はありますか? ありがとう。

編集:重要な点は、「// more code...」がインラインであり、完了ブロックにないことです。本当に私が知りたいのは、NSConditionLock を GCD と組み合わせて使用​​しても大丈夫ですか?そうでない場合、より良い方法は何ですか?

4

1 に答える 1

2

「//Morecode」を別のメソッドに入れて、そのメソッドを完了ブロックで呼び出すだけです。これにより、アニメーションが完了したときにのみコードが実行されるようになります。

于 2012-08-17T15:57:46.067 に答える