在为UIView设置动画时阻止串行调度队列

时间:2012-10-21 09:12:12

标签: objective-c ios grand-central-dispatch

有没有办法手动阻止队列任务?我想在调度队列任务中使用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...
});

3 个答案:

答案 0 :(得分:4)

使用dispatch_suspend暂停您的队列,然后在动画完成块中恢复它(使用dispatch_resume)。这将导致提交到队列的所有块在启动之前等待动画完成。请注意,暂停时已在该队列上运行的块将继续运行。

答案 1 :(得分:2)

  1. 不要在主线程以外的任何内容上进行UIView动画调用
  2. 如果您想在动画完成后执行某些操作,请将其放入动画的完成块中。这就是它的用途。

答案 2 :(得分:1)

Swift 3中的问题

我使用以下代码在Swift 3的主线程上执行。动画有效,但时机已关闭:

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

<强>解决方案

更新Sven对Swift 3的回答,我能够使用以下代码让我的动画正常运行:

DispatchQueue.main.suspend()
// animation code goes here. 
DispatchQueue.main.resume()