1. what is? 一个循环:线程进入并且用于于执行事件处理,目的为了响应某些incoming 事件。你的代码负责提供状态控制,用于实现runloop的实际循环部份(loop 循环体)。换句话说,你的代码提供的 while/for 循环驱动了run loop,在你的循环内,你是用一个runloop对象去“执行”事件——处理接受很多事件和安装事件处理方法的代码。
2. runloop接受两种不同的事件,有两种source:Input source and Timer source。Input source 传递异步事件,经常是一些来自其他程序线程的消息;Timer source 传递同步事件,在一个预定的时间执行或者有规律的重复。两种类型的源都使用一个程序化的规则在事件到来时进行处理。除了处理输入来源外,runloop 生成关于runloop行为的通知,注册observer可以受到这些通知,使用这些通知来对线程进行额外操作。
3. runloop mode,是一个source,timer,observer的集合,mode 里包含了所有需要处理的source,timer,observer。当runloop执行时,会检索当前的mode,执行里面的source,timer,observer。source,timer,observer创建时必须指定给某个mode,mode有currentMode,commonmode等。代码显示mode内有source0和source1两个source 集合,source0只有函数回调,source1是portbase source,有mach port处理。
4. runloop source是传递异步事件的结构,有两种类型——port-based source和custom input source,port-base source时内核相关的source,基于mach port,用于系统间不同线程通信,port-based source 在run loop执行完后不会主动删除自己,会一直停留在run loop内部等待下次事件的到来(除非runloop显示销毁?),AFNetworking就是注册了一个port,让nsurlconnection 在后台线程执行,当有回调时,让后台线程runloop处理事件;custom source 是一种自定义的source,需要自己定义事件传递机制等, source 的代码显示source 有自己的perform,schedule 方法,会在runloop run的时候调用。perform selector 就是一种custom source,是cocoa定义好的。它会序列化执行任务,不会造成多个方法同时执行问题,执行完后即在source集合里删除自己。run loop退出。当使用perform selector 把任务丢给某个线程时,该线程必须有一个未休眠活跃的run loop,不然这个source永远也不会被run loop 处理。run loop每次执行的时候,同时执行所有已经在队列中的perform selector任务,而不是每次run loop循环内执行一个。
5. run loop timer 也是一种source,只不过是让run loop 在预定时间执行的一种source。timer和perform selector一样,如果当前线程没有活跃的run loop,timer不会执行;如果timer的fire时间在runloop处理一个timer 后,那么这次的timer不会被出发,会等到下个timer的处理周期fire。
6. run loop observer,就是监听run loop 函数内不同处理时间时间的对象,代码显示内部有callback方法。