iOS-NSRunloop学习

RunLoop的基本作用 

    保持程序的持续运行,处理App中的各种事件(比如触摸事件、定时器事件等),节省CPU资源,提高程序性能:该做事时做事,该休息时休息。

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

有,线程保活和防止在界面进行滚动的状态下,NSTimer失效的问题。

runloop内部实现逻辑?

01、通知Observers:进入Loop

02、通知Observers:即将处理Timers

03、通知Observers:即将处理Sources

04、处理Blocks

05、处理Source0(可能会再次处理Blocks)

06、如果存在Source1,就跳转到第8步

07、通知Observers:开始休眠(等待消息唤醒)

08、通知Observers:结束休眠(被某个消息唤醒)

01> 处理Timer

02> 处理GCD Async To Main Queue

03> 处理Source1

09、处理Blocks

10、根据前面的执行结果,决定如何操作

01> 回到第02步

02> 退出Loop

11、通知Observers:退出Loop

runloop和线程的关系?

    一对一的关系,每条线程都有唯一的一个与之对应的RunLoop对象,RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value,线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建,主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop,RunLoop会在线程结束时销毁。

timer 与 runloop 的关系?

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

将runloop的运行模式修改成 NSRunloopCommonMode模式即可。

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

说说runLoop的几种状态


runloop的mode作用是什么?

kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行

UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

你可能感兴趣的:(iOS-NSRunloop学习)