-( void ) test11 {
dispatch_queue_t queue = dispatch_get_global_queue ( 0 , 0 );
dispatch_sync (queue, ^{
NSLog ( @"1" );
[ self performSelector : @selector (test1) withObject : self afterDelay : 0 ];
NSLog ( @"3" );
});
}
-( void ) test1 {
NSLog ( @"2" );
}
打印1 3 2 原理: 同步函数添加的任务是在当前线程中执行,当前线程就是主线程,而主线程的runloop 是启动的 ,所以test1 会调用。虽然延迟时间0秒,但是添加到runloop中的计时器不是里面触发的,而是要先唤醒runloop,这个是需要消耗时间的,所以先打印3 再2
dispatch_sync 改成异步?打印 ? 1 3
异步函数是开启一个新的线程,由于新的线程的runloop默认是没有启动的 ,所以并不会执行test1方法
performSelector:withObject:afterDelay:的本质是往Runloop中添加定时器(即使延时时间是0秒)
performSelector系列方法中只要是方法名中包含afterDelay、waitUntilDone的都是和计时器有关的 **