Ios 目标c方法队列

Ios 目标c方法队列,ios,objective-c,grand-central-dispatch,nsoperationqueue,Ios,Objective C,Grand Central Dispatch,Nsoperationqueue,我有一个方法,可以创建和动画视图 - (void) draw { UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(57, 353, 350, 80)]; [self.view addSubview:label]; [UIView animateWithDuration:3 delay:0 options:UIViewAnimationOpti

我有一个方法,可以创建和动画视图

- (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:

为了回答您的实际问题,您可以使用一个由NSMutableArray创建的简单队列。可以将动画调用封装为对象(完全自定义或简单地封装为块或NSInvocation),并将该对象推入阵列中。在这个场景中,您描述的一切都在主线程上运行,因此您不必进行任何同步。只需在开始制作动画时设置一个标志(isRunning),完成后尝试查看是否还有其他动画要开始。否则,将标志设置为false


这应该避免任何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
        }
    }
}
您可能应该在按下按钮时禁用它,然后在动画的完成块中重新启用它