关于Runloop
2017-10-01 本文已影响3人
攻克乃还_
一、基本
- 1.在runloop中有多个运行模式,但是只能选择一种模式运行
- 2.runloop运行至少要有一个
timer
或者是source
- 3.界面被拖拽时候,模式自动改为
UITrackingRunLoopMode
- 4.
kCFRunLoopCommonModes
模式包含了kCFRunLoopDefaultMode
与UITrackingRunLoopMode
二、Runloop内部
- runloop里面包含了Source,Observer, Timer
- Source又分为Port-Based Sources端口源, Custom Input Sources自定义源, Cocoa Perform Selector Sources
- Source又分为基于端口的(系统的)和非基于端口的
三、执行任务完毕后线程被销毁,如何开启常驻线程?为什么要开启?
- 开启常驻线程处理整个应用中的网络请求
- 1.开启常驻线程:在当前runloop中添加源或者NSTimer:(不推荐)
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
[runloop addTimer:timer forMode:NSDefaultRunLoopMode];
- 2.开启常驻线程:添加基于端口的事件(推荐)
[runloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[runloop run];
四、Runloop运行逻辑:
1.通知观察者即将进入runloop
2.通知观察者要处理定时器和源事件
3.处理定时器和源事件
4.通知观察者即将进入休眠
5.已经进入休眠
6.通知观察者runloop被唤醒
7.通知观察者即将推出runloop
五、Runloop中自动释放池的创建和释放
- 第一次创建:
- 即将进入runloop
- 最后一次销毁:
- 即将推出runloop
- 其他时候的创建和销毁
- 当runloop 即将睡眠 的时候,销毁之前的释放池, 重新创建一个新的
runloop的不同模式
1.UIInitializationRunLoopMode:启动时
2.UITrackingRunLoopMode:ScrollView滑动时
3.NSDefaultRunLoopMode:默认/空闲状态
4.NSRunLoopCommonModes:2,3 Mode
苹果公开的 Mode :3,4