什么是 runloop ?
runloop 是线程相关的基础框架的一部分。一个 runloop 就是一个事件处理的循环,用来不停的调度工作和处理输入事件。其实内部就是一个 do-while 循环,这个循环内部不断的处理各种任务(比如 Source、Timer、Observer)。使用 runloop 的目的,是让你的线程有工作的时候忙于工作,没有工作的时候处于休眠状态。
NSRunloop 和 CFRunloopRef
我们不能在一个线程中去操作另一个线程的 runloop 对象,那样可能会产生意想不到的后果。不过幸运的是,CoreFoundation 中的不透明类 CFRunloopRef 是线程安全的,而且两种类型的 runloop 完全可以混合使用。Cocoa 中 NSRunloop 类可以通过实例方法: -(CFRunloopRef )getCFRunloop;来获取对应的 CFRunloopRef 类,来达到线程安全的目的。
CFRunloopRef 类是在 CoreFoundation 框架里面的,它提供了纯 C 函数的 API,所有的这些 API 都是线程安全的。
NSRunloop 是基于 CFRunloopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。
Runloop 和线程的关系
Run loop 正如其名,loop 表示某种循环,和 run 放在一起就表示一直在运行的循环。runloop 和线程是紧密相关的,可以说 runloop 就是专为线程而生的,没有线程,那 runloop 就没有存在的必要。runloop 是线程的基础架构部分,Cocoa 和 CoreFoundation 都提供了 runloop 对象,方便 配置和管理 runloop。每个线程都有一个 runloop 对象,包括程序的主线程都有与之对应的 runloop 对象。
网友评论