- (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");
}
打印结果 为 1 3
dispatch_get_global_queue(0, 0) 是一个全局并发队列,在子线程中没有开启runloop.
performSelector:withObject:afterDelay: 方法依赖于 Run Loop 的运行,并且默认在 NSDefaultRunLoopMode 下运行。而子线程中runloop是默认关闭的。
当调用 performSelector:afterDelay: 时,其实内部会创建一个定时器,注册到当前线程的 RunLoop 中(如果当前线程没有 RunLoop,这个方法就会失效)。
有时候会看到 afterDelay:0,这样的作用是避免在当前的这个循环中执行,等下一次循环再执行。比方有时候会判断当前的 Mode 是否是 Tracking 或者 Default,为了避免判断错误,会使用 afterDelay:0 的方式将判断延迟到下一次 RunLoop 再执行。
在gcd中使用延迟调用的方法,使用diapatch_after为佳。