-
RunLoop的概念
每一个线程都有一个RunLoop对象,主线程默认开启RunLoop,子线程默认不开启。
RunLoop-
runloop的两个重要元素:
- Input Resources 输入源 performSelector:onThread:...输入源处理其他线程的消息
- Timer Resources 时间源 处理主线程时间(UI界面的刷新,滚动,点击...)
-
RunLoop的作用:
- runloop让主线程一直处于收发消息的状态,不会自动结束,保证了程序的运行
- 事件处理,点击事件,手势
- 节约CPU,无事挂起
-
什么时候使用运行循环?
官方文档是这么说的:The only time you need to run a run loop explicitly is when you create secondary threads for your application. 只有在你创建一个子线程的时候才需要run一个运行循环。主线程RunLoop是保证程序运行的基础和关键
而对于子线程,你需要根据自己的需要决定是否开启子线程,如果需要,那么需要自己配置并开启子线程RunLoop,比如下面四种情况:
-
使用ports或custom input sources与其他线程通信
-
在该线程使用timer
-
使用任一performSelector…方法
-
需要让线程执行定期任务
-
Event Loop
function loop() {
initialize();
do {
var message = get_next_message();
process_message(message);
} while (message != quit);
}
这种模型通常被称为Event Loop。这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息来到时立刻被唤醒。
所以RunLoop实际上是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行上面Event Loop的逻辑。线程执行了这个函数后,就会一直处于这个函数内部“接受消息->等待->处理”的循环中,直到这个循环结束(比如传入quit消息),函数返回。
-
RunLoop的mode
- kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
- UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。
- UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
- GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。
- kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。
-
RunLoop的底层实现
RunLoop的核心是基于底层mach port,进入休眠时调用的函数是mach_msg
(),待续...
RunLoop苹果官方文档
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
网友评论