iOS实现多个弹框按顺序依次弹出效果

  

有时候会有这样的需求:应用运行完,加载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);   });   });   }      

如此一来,就实现了我们的需求。

  

需要注意的是,这里为什么不用全局并发队列,主要是考虑到信号量会阻塞线程,优先级特别高,如果此时队列中还有任务,那么就会等待信号触发。当然也有人故意这么做。对于“弹框弹出的时间,不要做其他任何事情”这种需求是很合适的。当然我们千万不能去阻塞主线程!

  

我们在异步线程等待信号,在主线程发信号,如此就可以实现两个线程同步。其实信号量就是一种锁。

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

iOS实现多个弹框按顺序依次弹出效果