麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > iOS > 正文

iOS實現(xiàn)多個彈框按順序依次彈出效果

2019-10-21 18:40:09
字體:
供稿:網(wǎng)友

有時候會有這樣的需求:App 運行完,加載 RootVC ,此時需要做一些操作,比如檢查更新,之類的。此時可能會需要有2個甚至多個彈框依次彈出。

本篇將以系統(tǒng)的 UIAlertController 作為示例,當(dāng)然,如果是自定義的,也要看一下這篇文章,如何來處理多個彈窗。

首先,如果就按照如下的默認(rèn)寫法:

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框1" message:@"第一個彈框" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; UIAlertController *alert2 = [UIAlertController alertControllerWithTitle:@"彈框2" message:@"第二個彈框" preferredStyle:UIAlertControllerStyleAlert]; [alert2 addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]]; [self presentViewController:alert2 animated:YES completion:nil];}

會有什么問題呢?注意控制臺,肯定會輸出

Warning: Attempt to present <UIAlertController: 0x7ff4c3078c00>  on <SCTestViewController: 0x7ff4c2718c20> which is already presenting <UIAlertController: 0x7ff4c283ae00>

所以說,第二個彈框應(yīng)該是看不到的。

另一種情況,如果是自定義的 Alert ,你把它 add 為 window 的子視圖,這么做第二個彈框會蓋在第一個上面。如果你用了毛玻璃背景,效果會更加明顯。肯定不合適了。

所以,正確的解決辦法就是類似加鎖的過程,當(dāng)點擊了第一個彈框的某個按鈕之后,再彈出第二個彈框,以此類瑞。

這里,我想到用信號量去解決,但是信號量會阻塞線程,不可以直接在主線程使用。所以我們需要在子線程控制信號量,在主線程創(chuàng)建和顯示 Alert,直接上代碼。

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //創(chuàng)建一個隊列,串行并行都可以,主要為了操作信號量 dispatch_queue_t queue = dispatch_queue_create("com.se7en.alert", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{  //創(chuàng)建一個初始為0的信號量  dispatch_semaphore_t sema = dispatch_semaphore_create(0);  //第一個彈框,UI的創(chuàng)建和顯示,要在主線程  dispatch_async(dispatch_get_main_queue(), ^{   UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框1" message:@"第一個彈框" preferredStyle:UIAlertControllerStyleAlert];   [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {    //點擊Alert上的按鈕,我們發(fā)送一次信號。    dispatch_semaphore_signal(sema);   }]];   [self presentViewController:alert animated:YES completion:nil];  });  //等待信號觸發(fā),注意,這里是在我們創(chuàng)建的隊列中等待  dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  //上面的等待到信號觸發(fā)之后,再創(chuàng)建第二個Alert  dispatch_async(dispatch_get_main_queue(), ^{   UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框2" message:@"第二個彈框" preferredStyle:UIAlertControllerStyleAlert];   [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {    dispatch_semaphore_signal(sema);   }]];   [self presentViewController:alert animated:YES completion:nil];  });  //同理,創(chuàng)建第三個Alert  dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  dispatch_async(dispatch_get_main_queue(), ^{   UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"彈框3" message:@"第三個彈框" preferredStyle:UIAlertControllerStyleAlert];   [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {    dispatch_semaphore_signal(sema);   }]];   [self presentViewController:alert animated:YES completion:nil];  }); });}

如此一來,就實現(xiàn)了我們的需求。

需要注意的是,這里為什么不用全局并發(fā)隊列,主要是考慮到信號量會阻塞線程,優(yōu)先級特別高,如果此時隊列中還有任務(wù),那么就會等待信號觸發(fā)。當(dāng)然也有人故意這么做。對于 “彈框彈出的時間,不要做其他任何事情” 這種需求是很合適的。當(dāng)然我們千萬不能去阻塞主線程!

我們在異步線程等待信號,在主線程發(fā)信號,如此就可以實現(xiàn)兩個線程同步。其實信號量就是一種鎖。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲福利在线视频 | 在线观看国产日韩 | 成人偷拍片视频在线观看 | 成人国产精品一区 | 黄色一级毛片免费看 | 国产1区2区在线观看 | 久久亚洲成人网 | 国产高潮好爽受不了了夜色 | 精品一区二区三区在线观看国产 | 亚洲综合91 | 国产91丝袜在线播放0 | 精品国产高清一区二区三区 | 国产精品一区网站 | 黄色aaa视频| 懂色av懂色aⅴ精彩av | 国产噜噜噜噜噜久久久久久久久 | 日本欧美一区二区 | 最新亚洲国产 | 日韩av电影在线观看 | 久久成人综合网 | 操碰视频在线观看 | 久久久精品网站 | 91 久久| av中文字幕免费在线观看 | 欧美视频首页 | 国产精品av久久久久久久久久 | 在线看一区二区三区 | 欧美区在线 | 国产乱乱视频 | 欧洲成人综合网 | 日本成人一区二区三区 | 精品国内视频 | 免费a视频 | 欧美一级片一区 | 欧美一区二区网站 | 福利在线国产 | 亚洲精品在线观看网站 | 久久精品久久精品国产大片 | 久久国产夫妻视频 | 久久网站热最新地址4 | 成人精品 |