美文网首页
iOS开发中的运行循环机制

iOS开发中的运行循环机制

作者: 王蓝胖 | 来源:发表于2016-03-06 00:12 被阅读536次
    • RunLoop的概念

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

    RunLoop
    • runloop的两个重要元素:
      1. Input Resources 输入源 performSelector:onThread:...输入源处理其他线程的消息
      2. Timer Resources 时间源 处理主线程时间(UI界面的刷新,滚动,点击...)
    • RunLoop的作用:
      1. runloop让主线程一直处于收发消息的状态,不会自动结束,保证了程序的运行
      2. 事件处理,点击事件,手势
      3. 节约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
    1. kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
    2. UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。
    3. UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
    4. GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。
    5. kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。
    • RunLoop的底层实现

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

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

    相关文章

      网友评论

          本文标题:iOS开发中的运行循环机制

          本文链接:https://www.haomeiwen.com/subject/psxakttx.html