我按照SO answer
推迟UIKit
条消息
现在出现了另一个要求,我们还应该处理SSHUDView
的排队,而不仅仅是排队UIAlertView
方法调用。例如,一个场景可能是我们显示一个hud,然后在1秒后我们显示另一个hud,然后最后在1秒后我们显示UIAlertView
。
现在的问题是,由于SSHUDView
在后台线程上异步运行,当我显示UIAlertView
SSHUDView
时,UIAlertView
尚未显示,因此{{1}将覆盖hud。
基本上我需要一种方法来排队和延迟方法,无论它们是类SSHUDView
还是UIAlertView
。反馈队列,您可以在其中延迟单个消息。
答案 0 :(得分:1)
您所谈论的内容听起来非常适合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
。
答案 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
];
}
];
}
];