讲讲Runloop,项目中有用到吗?
其实Runloop内部就是一个do while循环,这个循环内部不断处理各种任务(比如Source, timer, observer),一个线程对应一个runloop,主线程的runloop默认开启,子线程的runloop需要手动开启(调用run方法),runloop只能选择一个mode启动,如果当前mode中没有任何source(source0,source1)、timer,那么就直接退出runloop。
Runloop的基本作用:
保持程序的持续运行
处理APP中的各种事件(比如触摸事件、定时器事件)
节省CPU资源,提高程序性能:该做事时做事,该休息时休息
Runloop应用范畴:
定时器(timer)、performSelector
GCD Async Main Queue
事件响应、手势识别、界面刷新
网络请求
AutoreleasePool
Runloop在实际项目中应用:
控制线程生命周期(线程保活 AFNetworking就是使用Runloop使子线程保活)
解决NSTimer在滑动时停止工作问题
监控应用卡顿
性能优化
Runloop的内部实现逻辑
Runloop和线程的关系
每一条线程都有唯一的一个与之对应的Runloop对象
Runloop保存在一个全局的Dictionary里,线程作为Key,Runloop作为value
线程刚创建事没有Runloop对象,Runloop会在第一次获取它时创建
timer与Runloop的关系,拖动tableView时,timer无法响应要怎么解决
timer是运行在Runloop里的,runloop来控制timer什么时候执行。
Runloop是怎么响应用户操作的,具体流程
说说Runloop的几种状态
Runloop的mode作用是什么
RunLoop的运行模式(一共5种)
- kCFRunLoopDefaultMode:APP默认mode,通常主线程在这个mode下运行
- UITrackingRunLoopMode:界面跟踪mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode的影响。
- UIInitializationRunLoopMode:在刚启动APP时进入的第一个mode,启动完成后就不在使用
- GSEventReceiveRunLoopMode:接受系统事件的内部mode,通常用不到
- kCFRunLoopCommonModes:这是一个占位用的mode,不是一种真正的运行模式