方法队列Objective-c

时间:2014-10-04 12:46:54

标签: 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: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做到这一点?

2 个答案:

答案 0 :(得分:1)

正如已经提到的那样,嵌套的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
        }
    }
}

您应该做的是在按下按钮时禁用该按钮,并在动画的完成块中重新启用它

答案 1 :(得分:0)

为什么要嵌套animateWithDuration:...调用?我相信你只需要一次调用animateWithDuration即可消除一些复杂性:...

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

这应该避免任何GCD电话。