iOS runLoop 理解
目录
-
概述
-
run loop modes
一、概述
run loop叫事件处理循环,就是循环地接受各种各样的事件。run loop是oc用来管理线程里异步事件的工具。一个线程通过run loop可以监听多个事件源(input、timer),当没有任何事件发生时run loop置线程于休眠状态,当事件到达时run loop唤醒线程处理这些事件。
系统会给每个线程(包过main thread)关联一个run loop对象,所以我们不需要手动的为每个线程创建run loop对象(通过[NSRunLoop currentRunLoop]可以获取)。
iOS程序在启动的时候,系统会自动启动main thread的run loop对象。其他线程的run loop对象并不会被系统自动运行,需要你在合适的时候手动的启动。
run loop有只有两种事件来源:input Sources 、timer Sources。
下图runloop运行机构图:
runloop 除了处理这些事件来源,还会把整个处理事件源的过程以通知的方式发送给runloop的观察者。
二、run loop modes
一个runloop modes 是指一个被监听的事件源的集合。每个事件源直接或者间接的关联着一个runloop modes。
runloop 每次 run 时都必须直接或者间接的指定一个 modes,在这次 loop 当中只有关联了此 modes 的事件源才能被监听和递交处理(观察者也只有在关联了此 modes 的情况下才能被通知)。关联其他的 modes 的事件源将不被监听和处理,直到runloop 运行在适合的 modes时它们才会被处理。
下表是modes的描述
Mode |
Name |
Description |
Default |
NSDefaultRunLoopMode (Cocoa) kCFRunLoopDefaultMode (Core Foundation) |
默认的mode,大多数情况是用这个mode运行runloop |
Connection |
NSConnectionReplyMode(Cocoa) |
Cocoa 用这个模式来监听NSConnection对象的事件,我们不会用到这个mode |
Modal |
NSModalPanelRunLoopMode(Cocoa) |
Cocoa 用这个模式来标识 modal panels(模态). |
Event tracking |
NSEventTrackingRunLoopMode(Cocoa) |
在鼠标拖动的过程中,Cocoa用这个模式来限制其他mode的监听与处理一提高UI交互的高效性。 |
Common modes |
NSRunLoopCommonModes (Cocoa) kCFRunLoopCommonModes (Core Foundation) |
是一个集合 cocoa下包含: default, modal, and event tracking modes Core Foundation下包含: default |
注意,创建一个NSTimer时,系统默认把这个定时器关联到NSDefaultRunLoopMode下,所以当滑动tableView时,即使定时器到点了也不会被触发的。这种情况,可以通过把timer关联到NSRunLoopCommonModes 来解决。