RunLoop与线程
1、每一条线程都有唯一的一个与之对应的RunLoop对象
2、RunLoop保存在一个全局的Dictionary里,线程作为Key,RunLoop作为Value
3、线程刚创建时,并没有RunLoop对象,RunLoop会在第一次获取她时创建
4、RunLoop会在线程结束的时候销毁
5、主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop
CFRunLoopModeRef常见的Mode
1、KCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行的
2、UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
vv3.kCFRunLoopCommonModes //这是一个占位用的Mode,不是一种真正的Mode 代表上面两种状态
RunLoop有几种状态
kCFRunLoopEntry = (1UL << 0), // 即将进入RunLoop
kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理Timer
kCFRunLoopBeforeSources = (1UL << 2), // 即将处理Source
kCFRunLoopBeforeWaiting = (1UL << 5), //即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6),// 刚从休眠中唤醒
kCFRunLoopExit = (1UL << 7),// 即将退出RunLoop
线程保活:
thread{
NSRunLoop *myLoop = [NSRunLoop currentRunLoop];
[myLoop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];//添加常驻线程
[myLoop run];//这种不退出 线程保活
}
好处:
避免多次创建线程或者线程轮询的开销,run loop在无事件处理时可以自动进入睡眠状态,降低CPU的能耗
参考:
RunLoop线程保活、启动
https://www.jianshu.com/p/24f875775336
https://github.com/SunshineBrother/JHBlog/blob/master/iOS%E7%9F%A5%E8%AF%86%E7%82%B9/iOS%E5%BA%95%E5%B1%82/8%E3%80%81RunLoop.md