在子線程調(diào)用performSelector: withObject: afterDelay 延時(shí)方法無效

最近在項(xiàng)目中發(fā)現(xiàn)performSelector: withObject: afterDelay延時(shí)操作有時(shí)是無效的,程序沒有繼續(xù)執(zhí)行。經(jīng)過代碼的分析發(fā)現(xiàn)這種情況一般都是發(fā)現(xiàn)在子線程中,結(jié)合runloop大概分析是以下原因。

  • 代碼分析
- (void)foo1 {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self performSelector:@selector(foo2) withObject:nil afterDelay:2];
    });
}
- (void)foo2 {
    NSLog(@"foo2");
}

在這種情況下程序是沒有任何反應(yīng)的,foo2并不會(huì)在延時(shí)之后執(zhí)行。
我們先看下foo1,在該方法中首先創(chuàng)建一個(gè)異步執(zhí)行的任務(wù),這時(shí)會(huì)開辟一個(gè)子線程,在這個(gè)子線程中我們?nèi)プ隽艘粋€(gè)延時(shí)的處理,但是這個(gè)延時(shí)是基于運(yùn)行循環(huán)的,而在子線程的runloop默認(rèn)是不開啟的,需要手動(dòng)去開啟[[NSRunLoop currentRunLoop] run],所以在這種情況下延時(shí)操作是無效的。而在主線程runloop是默認(rèn)開啟的所以一般情況下用performSelector: withObject: afterDelay做延時(shí)處理并沒有問題。

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

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

  • 翻譯來源: RunLoops Run Loops RunLoops是與線程緊密相關(guān)的基礎(chǔ)架構(gòu)的一部分,簡(jiǎn)稱運(yùn)行循環(huán)...
    AlexCorleone閱讀 694評(píng)論 0 1
  • 說明iOS中的RunLoop使用場(chǎng)景1.保持線程的存活,而不是線性的執(zhí)行完任務(wù)就退出了<1>不開啟RunLoop的...
    野生塔塔醬閱讀 6,936評(píng)論 15 109
  • 一、什么是runloop 字面意思是“消息循環(huán)、運(yùn)行循環(huán)”。它不是線程,但它和線程息息相關(guān)。一般來講,一個(gè)線程一次...
    WeiHing閱讀 8,329評(píng)論 11 111
  • 一、RunLoop 的概念 字面意思是“消息循環(huán)、運(yùn)行循環(huán)”,RunLoop 實(shí)際上就是一個(gè)事件循環(huán)對(duì)象,這個(gè)對(duì)象...
    風(fēng)輕魚蛋閱讀 581評(píng)論 0 1
  • 昨日同事在核對(duì)上周的招標(biāo)事情時(shí),發(fā)現(xiàn)了一個(gè)低級(jí)的卻很嚴(yán)重的錯(cuò)誤,那個(gè)工作是我當(dāng)時(shí)做的,因?yàn)楝F(xiàn)場(chǎng)比較混亂著急也就沒有...
    時(shí)貳婳閱讀 1,757評(píng)論 2 2

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