iOS 利用runloop阻塞主線程

這里的阻塞主線程盗扇,并不是真正的卡死,而是利用runloop讓主線程等待。

舉例:我有三個方法需要依次執(zhí)行testLogOne testLogTwo testLogThree,但是方法二testLogTwo中是有block或者是block 中有返回值的醇锚,方法三testLogThree需要等待方法二的block回調完成后才能執(zhí)行。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self testLogOne];
    [self testLogTwo:^{
        NSLog(@"----2----");
    }];
    [self testLogThree];
}

/// 方法一
- (void)testLogOne {
    NSLog(@"----1----");
}

/// 方法二
/// @param twoBlock 回調
- (void)testLogTwo:(void(^)(void))twoBlock {
    
    dispatch_async(dispatch_get_main_queue(), ^{
        if (twoBlock) {
            twoBlock();
        }
    });
}

/// 方法三
- (void)testLogThree {
    NSLog(@"----3----");
}

控制臺輸出

2021-03-16 18:04:41.691889+0800 demo[45188:559343] ----1----
2021-03-16 18:04:41.692060+0800 demo[45188:559343] ----3----
2021-03-16 18:04:41.714916+0800 demo[45188:559343] ----2----

使用信號量dispatch_semaphore_t ?

使用信號量dispatch_semaphore_t會直接卡死主線程坯临,永遠等待不到信號的的接收焊唬。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    /// 卡主線程
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self testLogOne];
    [self testLogTwo:^{
        NSLog(@"----2----");
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [self testLogThree];
}

使用dispatch_group_t ??

使用dispatch_group_t也可以將方法三testLogThree,放到dispatch_group_notify中執(zhí)行看靠,但是赶促,考慮到實際情況下,其他方法可能要比方法三testLogThree先執(zhí)行挟炬,所有也放棄了此用法的考慮鸥滨。雖然可以將方法三testLogThree放到block中嗦哆,但是如果有其他特殊情況,例如for循環(huán)爵赵,這樣也是不可取的吝秕。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    dispatch_group_t group = dispatch_group_create();

    [self testLogOne];

    for (NSInteger i = 0; i < 10; i ++) {
        dispatch_group_enter(group);
        [self testLogTwo:^{
            NSLog(@"----2----");
            dispatch_group_leave(group);
        }];
    }

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"----2----after");
        //[self testLogThree];
    });

    [self testLogThree];
}

控制臺輸出

2021-03-16 18:15:47.571770+0800 demo[48810:577013] ----1----
2021-03-16 18:15:47.572034+0800 demo[48810:577013] ----3----
2021-03-16 18:15:47.588403+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.588557+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.588653+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.588736+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.588830+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.588919+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.589213+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.589303+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.589590+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.589831+0800 demo[48810:577013] ----2----
2021-03-16 18:15:47.590538+0800 demo[48810:577013] ----2----after

使用runloop ?

運行runLoop一次泊脐,阻塞當前線程以等待處理空幻。根據(jù)條件進行while循環(huán),達到條件后runloop退出

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    __block BOOL isPerformNextStep = NO;

    [self testLogOne];


    for (NSInteger i = 0; i < 10; i ++) {
        [self testLogTwo:^{
            NSLog(@"----2----");
            isPerformNextStep = YES;
        }];
    }

    while (!isPerformNextStep) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
    [self testLogThree];
}

控制臺輸出:

2021-03-16 18:30:12.403732+0800 demo[54758:602699] ----1----
2021-03-16 18:30:12.407238+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.407371+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.407472+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.407554+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.407631+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.407726+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.407801+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.407909+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.408005+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.408137+0800 demo[54758:602699] ----2----
2021-03-16 18:30:12.408383+0800 demo[54758:602699] ----3----

參考資料

iOS開發(fā)-阻塞主線程
IOS 等待條件滿足再向下執(zhí)行但不主卡線程NSRunLoop

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末容客,一起剝皮案震驚了整個濱河市秕铛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缩挑,老刑警劉巖但两,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異供置,居然都是意外死亡谨湘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門芥丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紧阔,“玉大人,你說我怎么就攤上這事续担∩玫ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵物遇,是天一觀的道長乖仇。 經常有香客問我,道長询兴,這世上最難降的妖魔是什么乃沙? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮诗舰,結果婚禮上崔涂,老公的妹妹穿的比我還像新娘。我一直安慰自己始衅,他們只是感情好冷蚂,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汛闸,像睡著了一般蝙茶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诸老,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天隆夯,我揣著相機與錄音,去河邊找鬼。 笑死蹄衷,一個胖子當著我的面吹牛忧额,可吹牛的內容都是我干的。 我是一名探鬼主播愧口,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼睦番,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耍属?” 一聲冷哼從身側響起托嚣,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厚骗,沒想到半個月后示启,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡领舰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年夫嗓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冲秽。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡舍咖,死狀恐怖,靈堂內的尸體忽然破棺而出劳跃,到底是詐尸還是另有隱情谎仲,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布刨仑,位于F島的核電站郑诺,受9級特大地震影響,放射性物質發(fā)生泄漏杉武。R本人自食惡果不足惜辙诞,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轻抱。 院中可真熱鬧飞涂,春花似錦、人聲如沸祈搜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽容燕。三九已至梁呈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蘸秘,已是汗流浹背官卡。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工蝗茁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寻咒。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓哮翘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毛秘。 傳聞我的和親對象是個殘疾皇子饭寺,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內容