1.Runloop的实现原理,请查看该博客:http://www.jianshu.com/p/37ab0397fec7 或 http://blog.ibireme.com/2015/05/18/runloop/
个人笔记:
一.调用主线程的run loop进行阻塞的各种方式:
[[NSRunLoop mainRunLoop] run]; //主线程永远等待,但让出主线程时间片
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate distantFuture]]; //等同上面调用
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate date]]; //立即返回
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10.0]]; //主线程等待,但让出主线程时间片,然后过10秒后返回
[[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]]; //主线程等待,但让出主线程时间片;有事件到达就返回,比如点击UI等。
[[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate: [NSDate date]]; //立即返回
[[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate: [NSDate dateWithTimeIntervalSinceNow:10.0]]; //主线程等待,但让出主线程时间片;有事件到达就返回,如果没有则过10秒返回。
二.当add一个timer或port后,除非设定了超时时间或者remove了,否则runloop不会自动退出。可以用来常驻子线程,让子线程一直处理某事情,例如:AFNetworking中利用后台线程处理delegate回调。
三.几种应用场景:
1.开启一个常驻子线程(让子线程不消亡,等待其他线程消息,处理事件)。
2.线程之间同步。
3.在子线程中开启定时器或执行performSelector事件。
4.让定时器或performSelector事件在特定模式下执行。
5.添加observer监听runloop状态,比如监听点击事件。
四.与runloop、performSelector有关的timer一些接口:http://blog.csdn.net/lengshengren/article/details/12905635