中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-13 08:15:41 來源:腳本之家 閱讀:728 作者:Se7en丶瀟灑哥 欄目:移動開發

有時候會有這樣的需求: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 的子視圖,這么做第二個彈框會蓋在第一個上面。如果你用了毛玻璃背景,效果會更加明顯。肯定不合適了。

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

這里,我想到用信號量去解決,但是信號量會阻塞線程,不可以直接在主線程使用。所以我們需要在子線程控制信號量,在主線程創建和顯示 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];
 });
 });
}

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

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平利县| 邛崃市| 鹤岗市| 康定县| 喀什市| 阜城县| 陇川县| 资兴市| 铜山县| 新源县| 通城县| 白河县| 南郑县| 皋兰县| 邛崃市| 宝应县| 庆阳市| 武夷山市| 西吉县| 额敏县| 通道| 莱芜市| 连云港市| 剑阁县| 井陉县| 西安市| 偏关县| 大英县| 民权县| 潮州市| 河东区| 清徐县| 邢台市| 汉阴县| 康保县| 上犹县| 斗六市| 重庆市| 安庆市| 类乌齐县| 耒阳市|