iOS 使用信號(hào)量控制多個(gè)presentViewController方法短時(shí)間內(nèi)并發(fā)

最近在項(xiàng)目中遇到一個(gè)問題, 當(dāng)一個(gè)提示頁面是用present彈出并且?guī)?dòng)畫時(shí),一個(gè)個(gè)分別彈出沒有問題.但是當(dāng)需要同時(shí)彈出頁面并且一個(gè)疊一個(gè)時(shí)就會(huì)導(dǎo)致presentViewController丟失頁面,原因是當(dāng)上一個(gè)頁面彈出還未執(zhí)行完成的時(shí)候,下一個(gè)頁面present就無法真正的彈出.
這邊我寫一下我的解決方案
1.首先創(chuàng)建一個(gè)類繼承UINavigationController,在項(xiàng)目中這個(gè)類是我的window.rootViewController.
#import <UIKit/UIKit.h>
@interface RootNavigationVController : UINavigationController
@property (nonatomic, strong) dispatch_semaphore_t signal;
@end

如以上代碼所示為RootNavigationVController 添加dispatch_semaphore_t 后續(xù)我們使用信號(hào)量的方式來控制presentViewController的彈出.

2. 重寫- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)())completion 方法:
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)())completion {
      //初始化信號(hào)量,最高并發(fā)執(zhí)行 1
      if (!self.signal) {
          self.signal = dispatch_semaphore_create(1);
      }

      dispatch_async(dispatch_get_global_queue(0, 0), ^{
          //當(dāng)present被調(diào)用時(shí), wait -1,此時(shí)信號(hào)量為0,其他執(zhí)行等待
          dispatch_semaphore_wait(self.signal, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC));
          dispatch_async(dispatch_get_main_queue(), ^{
               //判斷是否是modal視圖
               if (self.presentedViewController) {
                    UIViewController *vc = self.presentedViewController;
                    while (vc.presentedViewController) {
                         vc = vc.presentedViewController;
                    }
                    //取棧頂?shù)膍odal視圖來執(zhí)行
                    [vc presentViewController:viewControllerToPresent animated:flag completion:^{
                         dispatch_semaphore_signal(self.signal); //彈窗完成信號(hào)量 +1 允許下一次彈窗任務(wù)執(zhí)行
                         if (completion) {
                            completion();
                          }
                     }];
               } else { //同上
                     [super presentViewController:viewControllerToPresent animated:flag completion:^{
                           dispatch_semaphore_signal(self.signal);
                           if (completion) {
                              completion();
                            }
                      }];
               }
          });
    });
}

這邊主要就是使用信號(hào)量在進(jìn)入presentViewContrller的時(shí)候?qū)€程進(jìn)行阻塞, 在并發(fā)的時(shí)候讓下一個(gè)執(zhí)行等待.然后completion 的block里面彈窗完成,將信號(hào)量+1,允許下一個(gè)頁面執(zhí)行.同時(shí)判斷上一個(gè)頁面類型使用不同方法進(jìn)行彈窗. 這邊我dispatch_semaphore_wait 的timeout設(shè)置是5秒,不同業(yè)務(wù)根據(jù)需求設(shè)置即可.

3.在業(yè)務(wù)中使用時(shí):
[self.navigationController presentViewController:vc animated:YES completion:nil];

這樣不會(huì)影響原有其他地方的presentViewController方法,使用上也沒有其他變化.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末默伍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖剥纷,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娩鹉,死亡現(xiàn)場(chǎng)離奇詭異牙瓢,居然都是意外死亡酌儒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門为居,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碌宴,“玉大人,你說我怎么就攤上這事蒙畴》×停” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵膳凝,是天一觀的道長(zhǎng)碑隆。 經(jīng)常有香客問我,道長(zhǎng)蹬音,這世上最難降的妖魔是什么上煤? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮著淆,結(jié)果婚禮上劫狠,老公的妹妹穿的比我還像新娘。我一直安慰自己永部,他們只是感情好独泞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著苔埋,像睡著了一般懦砂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天孕惜,我揣著相機(jī)與錄音,去河邊找鬼晨炕。 笑死衫画,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓮栗。 我是一名探鬼主播削罩,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼费奸!你這毒婦竟也來了弥激?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤愿阐,失蹤者是張志新(化名)和其女友劉穎微服,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缨历,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡以蕴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辛孵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丛肮。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖魄缚,靈堂內(nèi)的尸體忽然破棺而出宝与,到底是詐尸還是另有隱情,我是刑警寧澤冶匹,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布习劫,位于F島的核電站,受9級(jí)特大地震影響徙硅,放射性物質(zhì)發(fā)生泄漏榜聂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一嗓蘑、第九天 我趴在偏房一處隱蔽的房頂上張望须肆。 院中可真熱鬧,春花似錦桩皿、人聲如沸豌汇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拒贱。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逻澳,已是汗流浹背闸天。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斜做,地道東北人苞氮。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓤逼,于是被迫代替她去往敵國(guó)和親笼吟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容