我按照这个UIKit
推迟SO answer消息
现在出现了另一个要求,而不是仅仅排队SSHUDView
方法调用,我们也应该处理UIAlertView
的排队。例如,一个场景可能是我们显示一个hud然后在1秒之后我们显示另一个hud然后最后在1秒后我们显示一个UIAlertView
。
现在的问题是,由于SSHUDView
s在后台线程上异步运行,当我显示UIAlertView
时,SSHUDView
s还没有完成显示所以UIAlertView
将覆盖hud。
基本上我需要一种方法来排队和延迟方法,无论它们是类SSHUDView
还是UIAlertView
。反馈队列,您可以在其中延迟单个邮件。
您所谈论的内容听起来非常适合semaphores(请参阅“使用调度信号量调节有限资源的使用”标题下的内容)!我看到你链接的SO答案,我不认为它解决了UIView
动画的情况。这是我如何使用信号量。
在视图控制器中添加一个实例变量dispatch_semaphore_t _animationSemaphore;
并在- init
方法中初始化它:
- (id)init
{
if ((self = [super init])) {
_animationSemaphore = dispatch_semaphore_create(1);
}
return self;
}
(不要忘记使用- dealloc
在dispatch_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
模板来完成不同的事情,例如显示SSHUDView
或UIAlertView
。
你所描述的内容听起来就像一部动画。为什么不直接使用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
];
}
];
}
];