GCD面試題簡析

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_async(queue, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0];
        NSLog(@"3");
    });
}

- (void)test{
    NSLog(@"2");
}

打印結(jié)果 為 1 3

dispatch_get_global_queue(0, 0) 是一個(gè)全局并發(fā)隊(duì)列,在子線程中沒有開啟runloop.

performSelector:withObject:afterDelay: 方法依賴于 Run Loop 的運(yùn)行,并且默認(rèn)在 NSDefaultRunLoopMode 下運(yùn)行。而子線程中runloop是默認(rèn)關(guān)閉的。
當(dāng)調(diào)用 performSelector:afterDelay: 時(shí),其實(shí)內(nèi)部會創(chuàng)建一個(gè)定時(shí)器,注冊到當(dāng)前線程的 RunLoop 中(如果當(dāng)前線程沒有 RunLoop,這個(gè)方法就會失效)。
有時(shí)候會看到 afterDelay:0,這樣的作用是避免在當(dāng)前的這個(gè)循環(huán)中執(zhí)行,等下一次循環(huán)再執(zhí)行。比方有時(shí)候會判斷當(dāng)前的 Mode 是否是 Tracking 或者 Default,為了避免判斷錯誤,會使用 afterDelay:0 的方式將判斷延遲到下一次 RunLoop 再執(zhí)行。

在gcd中使用延遲調(diào)用的方法,使用diapatch_after為佳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • UIKit 1.UIView 和 CALayer 是什么關(guān)系? UIView 繼承 UIResponder,而 U...
    Sephiroth_Ma閱讀 2,428評論 0 25
  • iOS面試題(二) 消息發(fā)送和轉(zhuǎn)發(fā)機(jī)制,SEL和IMP 消息發(fā)送轉(zhuǎn)載自黃龍輝消息發(fā)送和消息轉(zhuǎn)發(fā)機(jī)制 在Object...
    滄州寧少閱讀 227評論 0 0
  • UIKit 1.UIView 和 CALayer 是什么關(guān)系? UIView 繼承 UIResponder,而 U...
    Angel_梅丹佐閱讀 4,476評論 0 2
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,619評論 1 32
  • 作為一個(gè)開發(fā)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要,這是一個(gè)我的iOS交流群:638302184,不管你是小白...
    iOS開發(fā)之家閱讀 3,651評論 0 18

友情鏈接更多精彩內(nèi)容