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

时间:2012-12-10 16:37:17

标签: objective-c cocoa-touch grand-central-dispatch

我按照SO answer

推迟UIKit条消息

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

现在的问题是,由于SSHUDView在后​​台线程上异步运行,当我显示UIAlertView SSHUDView时,UIAlertView尚未显示,因此{{1}将覆盖hud。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
                   ];
              }
          ];
     }
 ];