Objective-C - 排队和延迟UIKit消息

问题描述 投票:1回答:2

我按照这个UIKit推迟SO answer消息

现在出现了另一个要求,而不是仅仅排队SSHUDView方法调用,我们也应该处理UIAlertView的排队。例如,一个场景可能是我们显示一个hud然后在1秒之后我们显示另一个hud然后最后在1秒后我们显示一个UIAlertView

现在的问题是,由于SSHUDViews在后台线程上异步运行,当我显示UIAlertView时,SSHUDViews还没有完成显示所以UIAlertView将覆盖hud。

基本上我需要一种方法来排队和延迟方法,无论它们是类SSHUDView还是UIAlertView。反馈队列,您可以在其中延迟单个邮件。

objective-c cocoa-touch grand-central-dispatch
2个回答
1
投票

您所谈论的内容听起来非常适合semaphores(请参阅“使用调度信号量调节有限资源的使用”标题下的内容)!我看到你链接的SO答案,我不认为它解决了UIView动画的情况。这是我如何使用信号量。

在视图控制器中添加一个实例变量dispatch_semaphore_t _animationSemaphore;并在- init方法中初始化它:

- (id)init
{
  if ((self = [super init])) {
    _animationSemaphore = dispatch_semaphore_create(1);
  }
  return self;
}

(不要忘记使用- deallocdispatch_release方法中释放信号量。你也可能想要使用dispatch_semaphore_wait等待排队的动画完成,但我会留下让你弄清楚。)

当你想要排队动画时,你会做这样的事情:

- (void)animateSomething
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    dispatch_semaphore_wait(_animationSemaphore, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_main_queue(), ^{
      [UIView animateWithDuration:0.5 animations:^{
        // Your fancy animation code
      } completion:^(BOOL finished) {
        dispatch_semaphore_signal(_animationSemaphore);
      }];
    });
  });
}

您可以使用- animateSomething模板来完成不同的事情,例如显示SSHUDViewUIAlertView


0
投票

你所描述的内容听起来就像一部动画。为什么不直接使用UIView动画并链接一系列动画块:

[UIView animateWithDuration:2
     animations:^{
         // display first HUD
     }
     completion:^(BOOL finished){
         [UIView animateWithDuration:2
              animations:^{
                  // hide first HUD, display second HUD
              }
              completion:^(BOOL finished){
                  [UIView animateWithDuration:2
                       animations:^{
                           // hide second HUD, show UIAlert
                       }
                       completion:nil
                   ];
              }
          ];
     }
 ];
© www.soinside.com 2019 - 2024. All rights reserved.