亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現多個彈框按順序依次彈出效果

2020-07-26 02:25:07
字體:
來源:轉載
供稿:網友

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

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

首先,如果就按照如下的默認寫法:

- (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>

所以說,第二個彈框應該是看不到的。

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

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

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

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //創建一個隊列,串行并行都可以,主要為了操作信號量 dispatch_queue_t queue = dispatch_queue_create("com.se7en.alert", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{ //創建一個初始為0的信號量 dispatch_semaphore_t sema = dispatch_semaphore_create(0); //第一個彈框,UI的創建和顯示,要在主線程 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上的按鈕,我們發送一次信號。  dispatch_semaphore_signal(sema);  }]];  [self presentViewController:alert animated:YES completion:nil]; }); //等待信號觸發,注意,這里是在我們創建的隊列中等待 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); //上面的等待到信號觸發之后,再創建第二個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]; }); //同理,創建第三個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]; }); });}

如此一來,就實現了我們的需求。

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久久大神国产| 亚洲精品动漫久久久久| 国产最新精品视频| 欧美午夜精品久久久久久久| 免费97视频在线精品国自产拍| 久久精品国产91精品亚洲| 国产精品激情自拍| 日韩av免费看网站| 成人xxxxx| 欧美成年人在线观看| 91探花福利精品国产自产在线| 欧美成人精品不卡视频在线观看| 96精品久久久久中文字幕| 亚洲精品一区中文| 欧美疯狂性受xxxxx另类| 色综合视频一区中文字幕| 中文字幕欧美日韩精品| 国产综合福利在线| 国产精品一区二区三区免费视频| 亚洲国产成人久久综合一区| 欧美精品激情在线| 色午夜这里只有精品| 国产一区玩具在线观看| 精品国产精品三级精品av网址| 日韩在线视频中文字幕| 97av视频在线| 色先锋资源久久综合5566| 国产精品视频中文字幕91| 成人福利在线观看| 激情成人在线视频| 色悠悠久久久久| 亚洲激情电影中文字幕| 日韩电视剧免费观看网站| 亚洲www永久成人夜色| 欧美精品在线免费| 欧美理论电影在线观看| 精品一区二区三区电影| 欧洲精品在线视频| 亚洲直播在线一区| 欧美美最猛性xxxxxx| 国产成人精彩在线视频九色| 亚洲欧洲一区二区三区久久| 国产成人综合精品| 日韩国产在线播放| 欧美激情一级欧美精品| 国产欧美一区二区白浆黑人| 精品久久久免费| 日本免费久久高清视频| 亚洲人成绝费网站色www| 91精品国产沙发| 搡老女人一区二区三区视频tv| 亚洲欧美中文日韩v在线观看| 欧美理论在线观看| 亚洲成人中文字幕| 亚洲欧美综合精品久久成人| 久久精品在线视频| 欧美日韩一区二区免费视频| 精品久久中文字幕| 精品久久久久久中文字幕大豆网| 国产亚洲a∨片在线观看| 亚洲美女免费精品视频在线观看| 久久久999精品视频| 奇米四色中文综合久久| 欧美性xxxx极品hd欧美风情| 国产一区二区激情| 日韩中文字幕在线精品| 最近2019年中文视频免费在线观看| 亚洲色图色老头| 国产亚洲成av人片在线观看桃| 日韩电影网在线| 久久99久久99精品免观看粉嫩| 久久影视电视剧免费网站清宫辞电视| 国产成人精品免高潮费视频| 高清日韩电视剧大全免费播放在线观看| 国内精久久久久久久久久人| 黄色成人在线免费| 国产精品自产拍在线观看中文| 久久精品国产亚洲| 日韩av在线播放资源| 亚洲电影免费观看高清完整版在线| 欧美一级视频在线观看| 亚洲夜晚福利在线观看| 91久久在线播放| 久久久在线视频| 亚洲理论片在线观看| 91国产美女视频| 一本一本久久a久久精品牛牛影视| 久久精品一本久久99精品| 亚洲精品wwww| 啊v视频在线一区二区三区| 亚洲全黄一级网站| 久久久国产视频91| 亚洲视频在线看| 国外成人在线视频| 亚洲国产成人av在线| 亚洲精品第一国产综合精品| 色综合伊人色综合网| 久久久精品在线| 精品亚洲一区二区三区在线观看| 日产精品99久久久久久| 久久男人资源视频| 欧美高清在线观看| 91亚洲精品在线| 久久激情视频免费观看| 久久在线观看视频| 国产在线a不卡| 久久久久久久久久久亚洲| 国产精品女人网站| 清纯唯美亚洲激情| 欧美精品www| 欧美成人免费小视频| 欧美一级淫片丝袜脚交| 欧美色xxxx| 国产精品精品一区二区三区午夜版| 美女扒开尿口让男人操亚洲视频网站| 欧美一区二区三区免费视| 国产精品视频免费在线观看| 色先锋久久影院av| 国产精品入口尤物| 免费91麻豆精品国产自产在线观看| 国产精品高清在线| 日韩视频免费在线| 久久久日本电影| 精品国产一区二区三区久久久狼| 96国产粉嫩美女| 97avcom| 国产精品中文字幕在线观看| 俺去亚洲欧洲欧美日韩| 一本色道久久综合狠狠躁篇的优点| 91精品久久久久久久久久久久久| 国产中文欧美精品| 中文欧美日本在线资源| 国产一区二区三区在线免费观看| 色婷婷综合久久久久中文字幕1| 国产精品久久久久国产a级| 欧美最顶级的aⅴ艳星| 国产精品久久久久久亚洲影视| 精品视频在线导航| 日韩欧美在线网址| 国产精品最新在线观看| 国产一区二区动漫| 国产91在线播放九色快色| 亚洲精品一区二区网址| 欧美午夜宅男影院在线观看| 欧美国产激情18| 欧美日韩在线视频首页| 日本精品一区二区三区在线播放视频| 日本高清+成人网在线观看| 亚洲а∨天堂久久精品9966| 久久人人爽人人爽人人片亚洲| 97精品国产97久久久久久| 亚洲国产精彩中文乱码av在线播放| 亚洲国产成人一区| 欧美重口另类videos人妖| 国产精品永久免费视频| 国产精品pans私拍| 亚洲自拍小视频免费观看| 中文字幕精品一区二区精品| 国产精品亚洲аv天堂网| 日本高清+成人网在线观看| 久久亚洲精品中文字幕冲田杏梨| 91亚洲永久免费精品| 欧美丝袜一区二区三区| 久久成人精品电影|