iOS开发中的运行循环机制

2016-03-06  本文已影响536人  王蓝胖

每一个线程都有一个RunLoop对象,主线程默认开启RunLoop,子线程默认不开启。

RunLoop

官方文档是这么说的:The only time you need to run a run loop explicitly is when you create secondary threads for your application. 只有在你创建一个子线程的时候才需要run一个运行循环。主线程RunLoop是保证程序运行的基础和关键
而对于子线程,你需要根据自己的需要决定是否开启子线程,如果需要,那么需要自己配置并开启子线程RunLoop,比如下面四种情况:

function loop() {
    initialize();
    do {
        var message = get_next_message();
        process_message(message);
    } while (message != quit);
}

这种模型通常被称为Event Loop。这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息来到时立刻被唤醒。
所以RunLoop实际上是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行上面Event Loop的逻辑。线程执行了这个函数后,就会一直处于这个函数内部“接受消息->等待->处理”的循环中,直到这个循环结束(比如传入quit消息),函数返回。

  1. kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
  2. UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。
  3. UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
  4. GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。
  5. kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。

RunLoop的核心是基于底层mach port,进入休眠时调用的函数是mach_msg
(),待续...

RunLoop苹果官方文档
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

上一篇 下一篇

猜你喜欢

热点阅读