Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

block serial dispatch queue while animating a UIView

Is there a way to manually block a queue task? I want to use UIView animation inside a dispatch queue task, but this task should only get finished when the animation is completed.

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...
});
like image 208
miho Avatar asked Dec 10 '25 14:12

miho


2 Answers

Suspend your queue using dispatch_suspend and then resume it (using dispatch_resume) in your animation completion block. This will cause all blocks submitted to the queue to wait for the animation to complete before they are started. Note that blocks already running on that queue when you suspend it will continue running.

  1. Don't make UIView animation calls on anything other than the main thread
  2. If you want something to execute after an animation has completed, put it in the animation's completion block. It's what it is there for.
like image 36
jrturton Avatar answered Dec 13 '25 04:12

jrturton



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!