- (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為佳。