最近在項(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í)處理并沒有問題。