ios - Objective-c 方法队列

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

我有一个可以创建 View 并为其设置动画的方法

- (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) {
                 }];

单击按钮时调用此方法。但是,如果我快速单击,新 View 就会出现,而无需等待前一个 View 完成。我想创建一个方法队列,例如,当我点击按钮时,新事件将被推送到队列中,并且所有事件都在等待前一个事件完成后才能开始。也许我可以使用 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
        }
    }
}

您可能应该做的是在按下按钮时禁用它,然后在动画的完成 block 中重新启用它

关于ios - Objective-c 方法队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192979/

相关文章:

ios - 如何移动特定 Sprite

ios - 如何使用 Interface Builder 设置 UIScreenEdgePanGestureRecognizer?

ios - 固定 header 的问题有时会在 iOS 上消失

ios - 如何在不使用 iTunes 和 TestFlight 的情况下在测试设备上安装临时配置文件

iOS 8 以一种奇怪的方式崩溃

objective-c - 不使用 XCode 进行 Iphone 开发

iphone - 在应用程序的下一个操作之前完成请求操作

iphone - 为什么 MPMovieDurationAvailableNotification 只为我的 MPMoviePlayerController 的多个实例调度一次?

ios - 必须分派(dispatch)到 iOS 11 中的主线程

iOS 多线程 - NSURLSession 和 UI 更新