RunLoop

什么是RunLoop

顾名思义运行循环在程序运行过程中循环做一些事情

讲讲 RunLoop,项目中有用到吗?

应用范畴:
定时器(Timer)、PerformSelector
GCD Async Main Queue
事件响应、手势识别、界面刷新
网络请求
AutoreleasePool
控制线程生命周期(线程保活)
解决NSTimer在滑动时停止工作的问题
监控应用卡顿
性能优化

RunLoop的基本作用:

1 保持程序的持续运行
2 处理APP的各种事件(触摸事件、定时器事件)
3 节省CPU 提高程序的性能,该做事的时候做事,不该做事的时候休息

Runloop内部实现逻辑?

  • iOS中有2套API来访问和使用RunLoop
  • Foundation:NSRunLoop
  • Core Foundation:CFRunLoopRef
  • NSRunLoop和CFRunLoopRef都代表着RunLoop对象
  • NSRunLoop是基于CFRunLoopRef的一层OC包装
  • CFRunLoopRef是开源的
  • https://opensource.apple.com/tarballs/CF/

Runloop和线程的关系?

每条线程都有唯一的一个与之对应的RunLoop对象
RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value
线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建,个人理解就是这个runloop并不是在创建线程的时候就会有一个runloop 而是在我们需要调用这个线程的runloop的时候,就会去创建属于这个线程的runloop对象,如果已经创建过,则取出这个对象使用
RunLoop会在线程结束时销毁
主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

Timer 与 Runloop 的关系?

程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?

runloop 是怎么响应用户操作的, 具体流程是什么样的?

image.png

image.png

image.png

说说runLoop的几种状态? runloop的mode作用是什么?

目前已知的模式类型:
常见的2种Mode
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
不常见的3种
UIinitiatlizationRunLoopModel: 在刚启动APP 时进入的第一个model,启动完成不再使用
GSEventReceiveRunLoopModel:接受系统事件的内部model 通常用不到
KCFRunLoopCommonModels: 这是一个占位用的model 不是一种真正的model
CFRunLoopModeRef代表RunLoop的运行模式
一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
RunLoop启动时只能选择其中一个Mode,作为currentMode
如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出

你可能感兴趣的:(RunLoop)