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

Swift 3 中的问题

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

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

解决方案

更新斯文对 Swift 3 的回答后,我可以使用以下代码让我的动画正常运行:

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