runloop

80 阅读1分钟

-( 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的都是和计时器有关的 **