RunLopp的定义
问 RunLoop 是什么 ?
答 RunLoop 实质就是一个死循环 用以保证程序的持续运行 只有当程序退出的时候才会退出 (由main函数开启主线程的RunLoop)
问 RunLoop 的作用 ?
答 1. 保持程序的持续运行 2. 处理App中的各种事件(触摸 定时器 selctor 等) 3.节省cpu资源 提高程序性能
问 RunLoop 如何获取 ?
答 使用NSRunLoop(面向对象) 或者 CFRunLoopRef(底层C语言)获取
RunLoop 的概念
一般来讲 一个线程一次只能执行一次任务 执行完后线程就会退出 如果我们需要一个机制 让线程能够随时处理时间并不退出,这种模型通常称为Event RunLoop 在很多系统和框架里都有所实现 比如Node.js的事件处理,比如windows的消息循环 ,再比如OSX/iOS 里的RunLoop 实现这种模型的关键点在于 如何管理事件/消息 如何让线程在没有处理消息时休眠避免资源占用 在有消息来时立刻被唤醒。
所以RunLoop 实际就是一个对象 这个对象管理了实际需要处理的事件和消息 并提供了一个入口函数 来执行上边EventLoop的逻辑
RunLoop 的使用
假设我们用一个定时器来做UI上的倒计时,当我们操作UI时 主线程的RunLoop会切换到UITrackingRunLoopMode这个model 执行的也是UITrackingRunLoopMode下的 所以timer任务并不会执行 只有当UITrackingRunLoopMode的人任务执行完毕 ,RunLoop切换到NSDefaultRunLoopMode后 才会继续执行timer
如何解决这个问题呢,解决方法很简单,我们只需要在添加timer时 将model设置为NSRunLoopCommonModes 即可
网友评论