有时候会有这样的需求:应用运行完,加载RootVC,此时需要做一些操作,比如检查更新,之类的。此时可能会需要有2个甚至多个弹框依次弹出。
本篇将以系统的UIAlertController作为示例,当然,如果是自定义的,也要看一下这篇文章,如何来处理多个弹窗。
首先,如果就按照如下的默认写法:
- (void) viewDidAppear:(BOOL)动画{ (超级viewDidAppear:动画); UIAlertController *警报=[UIAlertController alertControllerWithTitle: @”弹框1”信息:@“第一个弹框”preferredStyle: UIAlertControllerStyleAlert); [警报addAction: [UIAlertAction actionWithTitle: @”取消”风格:UIAlertActionStyleCancel处理程序:nil)]; 【自我presentViewController:警报动画:是的完成:nil); UIAlertController * alert2=[UIAlertController alertControllerWithTitle: @”弹框2”信息:@“第二个弹框”preferredStyle: UIAlertControllerStyleAlert); [alert2 addAction:(UIAlertAction actionWithTitle: @”取消”风格:UIAlertActionStyleCancel处理程序:nil)]; 【自我presentViewController: alert2动画:是的完成:nil); } >之前会有什么问题呢?注意控制台,肯定会输出
警告:尝试& lt; UIAlertController: 0 x7ff4c3078c00>,> - (void) viewDidAppear:(BOOL)动画{ (超级viewDidAppear:动画);//创建一个队列,串行并行都可以,主要为了操作信号量=dispatch_queue_create (“com.se7en dispatch_queue_t队列。警戒”,DISPATCH_QUEUE_SERIAL); 设置(队列,^ {//创建一个初始为0的信号量 dispatch_semaphore_t=某dispatch_semaphore_create (0);//第一个弹框,UI的创建和显示,要在主线程 设置(dispatch_get_main_queue ()、^ { UIAlertController *警报=[UIAlertController alertControllerWithTitle: @”弹框1”信息:@“第一个弹框”preferredStyle: UIAlertControllerStyleAlert); [警报addAction: [UIAlertAction actionWithTitle: @”取消”风格:UIAlertActionStyleCancel处理程序:^ (UIAlertAction * _Nonnull行动){//点击通知上的按钮,我们发送一次信号。 dispatch_semaphore_signal(某); }]]; 【自我presentViewController:警报动画:是的完成:nil); });//等待信号触发,注意,这里是在我们创建的队列中等待 dispatch_semaphore_wait (sema DISPATCH_TIME_FOREVER);//上面的等待到信号触发之后,再创建第二个警报 设置(dispatch_get_main_queue ()、^ { UIAlertController *警报=[UIAlertController alertControllerWithTitle: @”弹框2”信息:@“第二个弹框”preferredStyle: UIAlertControllerStyleAlert); [警报addAction: [UIAlertAction actionWithTitle: @”取消”风格:UIAlertActionStyleCancel处理程序:^ (UIAlertAction * _Nonnull行动){ dispatch_semaphore_signal(某); }]]; 【自我presentViewController:警报动画:是的完成:nil); });//同理,创建第三个警告 dispatch_semaphore_wait (sema DISPATCH_TIME_FOREVER); 设置(dispatch_get_main_queue ()、^ { UIAlertController *警报=[UIAlertController alertControllerWithTitle: @”弹框3”信息:@“第三个弹框”preferredStyle: UIAlertControllerStyleAlert); [警报addAction: [UIAlertAction actionWithTitle: @”取消”风格:UIAlertActionStyleCancel处理程序:^ (UIAlertAction * _Nonnull行动){ dispatch_semaphore_signal(某); }]]; 【自我presentViewController:警报动画:是的完成:nil); }); }); }
如此一来,就实现了我们的需求。
需要注意的是,这里为什么不用全局并发队列,主要是考虑到信号量会阻塞线程,优先级特别高,如果此时队列中还有任务,那么就会等待信号触发。当然也有人故意这么做。对于“弹框弹出的时间,不要做其他任何事情”这种需求是很合适的。当然我们千万不能去阻塞主线程!
我们在异步线程等待信号,在主线程发信号,如此就可以实现两个线程同步。其实信号量就是一种锁。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。