运行循环:RunLoop
1.作用:
1>保证程序不会退出
2>监听所有事件:触摸、时钟、网络事件
2.特性:
1>如果没有任何事件发生,会进入休眠状态(省电)
2>一旦监听到事件,会立即循环
3>每一个线程都有一个 runloop,但是只有主线程的 runloop 会默认启动
3.注意:
1>runloop是在iOS开发的原始时代,需要大量使用
2>运行循环在 iOS 开发中几乎不用,但是要理解概念和原理
4.运行循环模式:
1>NSDelaultRunLoopModel
默认的运行循环模式:监听时钟、网络等跟UI无关的事件
2>NSRunLoopCommonModes
通用的运行循环模式:监听用户交互事件,优先级最高,保证用户一旦交互,立即做出响应。
5.时钟操作:
1>注意
one :时钟触发方法是同步的,没有开启线程
two: 时钟触发方法的中,不能有太耗时的操作,否则会造成卡顿
6.运行循环最重要特性:
每一个线程都有一个 runloop,但是只有主线程的 runloop 会默认启动,子线程如果要监听事件,需要手动开启子线程的运行循环
7.手动开启子线程的运行循环方式
1> run
是真正的死循环,启动运行循环就不会在执行后续代码
如果用 run 直接启动运行循环,很难停掉循环,线程永远不会被停止
[[ NSRunLoop currentRunLoop ] run ];
2>通过OC停止运行循环
one: 手写死循环,定义 bool 变量, 性能不好
self .finished = NO ;
//手写一个死循环
while (! self . finished ) {
//让运行循环监听0.1s的事件
[[ NSRunLoop currentRunLoop ] runMode : NSDefaultRunLoopMode beforeDate :[ NSDate dateWithTimeIntervalSinceNow : 0.1 ]];
}
two: 停止运行循环
self .finished = YES ;
3>使用 CoreFoundation (C语言框架),停止运行循环
one: 定义CFRunLoopRef类型的成员变量:表示时钟线程所在的运行循环
@property ( nonatomic , assign ) CFRunLoopRef timerRunLoop;
two: 启动运行循环
利用底层方式启动运行循环,不用程序员在手写 while 死循环 ,可以利用 runloop本身的特性
没有事件自动休眠
self .timerRunLoop =CFRunLoopGetCurrent();
three: 让时钟所在的运行循环停止
CFRunLoopStop( self .timerRunLoop);
1.作用:
1>保证程序不会退出
2>监听所有事件:触摸、时钟、网络事件
2.特性:
1>如果没有任何事件发生,会进入休眠状态(省电)
2>一旦监听到事件,会立即循环
3>每一个线程都有一个 runloop,但是只有主线程的 runloop 会默认启动
3.注意:
1>runloop是在iOS开发的原始时代,需要大量使用
2>运行循环在 iOS 开发中几乎不用,但是要理解概念和原理
4.运行循环模式:
1>NSDelaultRunLoopModel
默认的运行循环模式:监听时钟、网络等跟UI无关的事件
2>NSRunLoopCommonModes
通用的运行循环模式:监听用户交互事件,优先级最高,保证用户一旦交互,立即做出响应。
5.时钟操作:
1>注意
one :时钟触发方法是同步的,没有开启线程
two: 时钟触发方法的中,不能有太耗时的操作,否则会造成卡顿
6.运行循环最重要特性:
每一个线程都有一个 runloop,但是只有主线程的 runloop 会默认启动,子线程如果要监听事件,需要手动开启子线程的运行循环
7.手动开启子线程的运行循环方式
1> run
是真正的死循环,启动运行循环就不会在执行后续代码
如果用 run 直接启动运行循环,很难停掉循环,线程永远不会被停止
[[ NSRunLoop currentRunLoop ] run ];
2>通过OC停止运行循环
one: 手写死循环,定义 bool 变量, 性能不好
self .finished = NO ;
//手写一个死循环
while (! self . finished ) {
//让运行循环监听0.1s的事件
[[ NSRunLoop currentRunLoop ] runMode : NSDefaultRunLoopMode beforeDate :[ NSDate dateWithTimeIntervalSinceNow : 0.1 ]];
}
two: 停止运行循环
self .finished = YES ;
3>使用 CoreFoundation (C语言框架),停止运行循环
one: 定义CFRunLoopRef类型的成员变量:表示时钟线程所在的运行循环
@property ( nonatomic , assign ) CFRunLoopRef timerRunLoop;
two: 启动运行循环
利用底层方式启动运行循环,不用程序员在手写 while 死循环 ,可以利用 runloop本身的特性
没有事件自动休眠
self .timerRunLoop =CFRunLoopGetCurrent();
three: 让时钟所在的运行循环停止
CFRunLoopStop( self .timerRunLoop);