Runloop就是运行循环,每个线程内都会有一个运行循环.
只有主线程的运行循环是默认开启的,子线程的运行循环默认是不开启的.
运行循环的作用
1.保证程序不退出(ios的应用程序启动之后,之所以不会退出,就是因为Runloop,运行循环是一个死循环,只有满足一定条件之后才会结束循环.
2.负责处理输入时间.
3.如果没有事件发生,会让程序进入休眠状态
输入事件
Runloop 接收的事件来自两种不同的来源:
1.输入源(Input sources)
2.定时源 (Timer sources)
3.输入源能通过runUntilDate 方法使线程退出;定时源不能和使线程退出.
运行循环的模式
运行循环模式是输入源和定时源的一个集合,这个集合会被监听
每次启动运行循环,可以指定一个特殊的模式,在运行循环执行期间,只有跟特定的模式相关联的事件源才会被监听以及允许传递它们的事件,跟其他模式相关联的事件源不会被监听.因此,可以通过运行循环来过滤掉一些不期望的事件.
下面是系统定义的集中运行循环模式:
Default: default模式可以用于大多数操作。在大多数时间,应该使用这种模式来启动和设置输入源。
Connection: Cocoa使用这种模式联合NSConnection对象来监听响应。我们很少会自己用到这种模式。
Modal: Cocoa使用这种模式来识别为模态面板准备的事件。
Event tracking: Cocoa使用这种模式来约束鼠标拖拽或其它用户界面追踪循环的事件。
Common modes: 这是一个通用的模式组,使用这种模式关联输入源,同样会关联这个模式组里面的每一种模式。对于Cocoa应用来说,这个集合包含了 default、modal以及event tracking模式。
Core Foundation初始状态下只包含 default 模式,但是可以
通过 CFRunLoopAddCommonMode函数来添加自定义模式。
总结:运行循环是一个指定的模式下运行的,输入事件也有对应的模式,只有当二者的模式相匹配,对应的方法才会执行.
运行循环模式:运行循环启动时,默认模式为 NSRunLoopDefaultMode
如果滚动的为scrollview,运行循环模式为UITrackingRunLoopMode
子线程的运行模式
主线程的运行循环默认是开启的,子线程的运行循环默认是不开启的
[NSRunLoop currentRunLoop] run]; 开启子线程的运行循环
runUntilDate 退出运行循环