3

キュータスクを手動でブロックする方法はありますか?ディスパッチキュータスク内でUIViewアニメーションを使用したいのですが、このタスクはアニメーションが完了したときにのみ終了する必要があります。

dispatch_queue_t myCustomQueue;
myCustomQueue = dispatch_queue_create("com.example.MyCustomQueue", NULL);

dispatch_async(myCustomQueue, ^{
    [UIView animateWithDuration:myDuration
                          delay:0.0f
                        options:0
                     animations:^{
                         // my changes here
                     }
                     completion:nil];
});

dispatch_async(myCustomQueue, ^{
    // if the animation from the task below is still running, this task should wait until it is finished...
});
4

3 に答える 3

4

を使用してキューを一時停止してから、アニメーション完了ブロックdispatch_suspendで(を使用して)再開します。dispatch_resumeこれにより、キューに送信されたすべてのブロックは、アニメーションが完了するのを待ってから開始されます。一時停止したときにそのキューですでに実行されているブロックは、引き続き実行されることに注意してください。

于 2012-10-21T09:36:32.643 に答える
2
  1. メインスレッド以外でUIViewアニメーション呼び出しを行わないでください
  2. アニメーションの完了後に何かを実行したい場合は、それをアニメーションの完了ブロックに入れます。それはそれが何のためにあるのかです。
于 2012-10-21T09:19:20.810 に答える
1

Swift3の問題

次のコードを使用して、Swift 3のメインスレッドで実行しました。アニメーションは機能しましたが、タイミングがずれていました。

// Animation works, timing is not right due to async
DispatchQueue.main.async {
    // animation code
}

解決

Swift 3に対するSvenの回答を更新すると、次のコードを使用してアニメーションを正しく実行することができました。

DispatchQueue.main.suspend()
// animation code goes here. 
DispatchQueue.main.resume()
于 2016-10-12T20:16:25.777 に答える