我有一个方法可以创建和动画化视图
- (void) draw {
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(57, 353, 350, 80)];
[self.view addSubview:label];
[UIView animateWithDuration:3
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
[UIView animateWithDuration:2
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
label.alpha = 0;
} completion:^(BOOL finished) {
[self.view willRemoveSubview:label];
}];
} completion:^(BOOL finished) {
}];
}
此方法在单击按钮时调用。但如果我快速点击,新视图会在前一个视图完成后立即显示。我想创建一个方法队列,比如,当我点击按钮时,新事件被推到队列中,所有事件都在等待上一个事件完成后开始。也许我可以使用NSOperationQueue或GCD来完成此操作?
如前所述,嵌套的animateWithDuration:是怎么回事。此外,更重要的是,您可能不想对NSOperationQueue或GCD做任何事情,因为所有动画都必须在主线程上完成。如果你真的想做一些线程,你最终会得到像这样的东西
-(void)draw
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
dispatch_sync(dispatch_get_main_queuem ^{
//do your animations and pray you don't cause deadlock
}
}
}
您可能应该做的是在按下按钮时禁用该按钮,并在动画的完成块中重新启用它
为什么要嵌套animateWithDuration:。。。呼叫我相信,只需调用一次animateWithDuration,就可以消除一些复杂性:。。。
要回答您的实际问题,您可以使用一个由NSMutableArray组成的简单队列。您可以将动画调用封装为对象(完全自定义或简单地封装为块或NSInvocation),并将该对象推入数组。在您描述的场景中,所有内容都在主线程上运行,因此不必进行任何同步。只需在开始制作动画时设置一个标志(isRunning),完成后试着看看是否还有其他动画要开始。否则,将标志设置为false。
这应该可以避免任何GCD调用。