美文网首页iOS的日常
RunLoop学习总结

RunLoop学习总结

作者: GeniusWong | 来源:发表于2018-08-13 20:05 被阅读12次

RunLoop的定义

当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程。RunLoop就是控制线程生命周期并接收事件进行处理的机制。

RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿整个系统。

使用RunLoop的目的

通过RunLoop机制实现省电,流畅,响应速度快,用户体验好

特性

- 主线程的RunLoop在应用启动时会自动创建

- 其它线程则需要在该线程下自己启动

- RunLoop并不是线程安全的,所以需要避免在其它线程上调用当前线程的RunLoop

- RunLoop负责管理AutoRelease Pools

- RunLoop负责处理消息事件,即输入源事件和计时器事件

RunLoop机制

主线程(有RunLoop的线程)几乎所有的函数都从以下六个之一的函数调起:

- CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION

    用于向外部报告RunLoop当前状态的更改,框架中很多机制都由RunLoopObserver触发,如 CAAnimation

- CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK

    消息通知、非延迟的Perform、Dispatch调用、Block调用、KVO

- CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE

-  CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION

    延迟的Perform, 延迟Dispatch 调用 

- CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION

    处理APP内部事件、App自己负责管理(触发),如 UIEvent 、CFSocket。普通函数调        用、系统调用

 - CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION

    由RunLoop和内核管理,Mach Port驱动,如CFMachPort、CFMessagePort

    主要有以下六种状态:

        kCFRunLoopEntry -- 进入runloop循环

        kCFRunLoopBeforeTimers -- 处理定时调用前回调

        kCFRunLoopBeforeSources -- 处理input sources的事件

        kCFRunLoopBeforeWaiting -- runloop睡眠前调用

        kCFRunLoopAfterWaiting -- runloop唤醒后调用

        kCFRunLoopExit -- 退出runloop

RunLoop Modes 

     RunLoop Mode 就是流水线上支持生产的产品类型,流水线在一个时刻只能在一种模式下运行, 生产某一类型的产品。消息事件就是订单。

    Cocoa 定义了4种Mode

    NSDefaultRunLoopMode      默认模式,在没有指定Mode的时候,默认

    UITrackingRunLoopMode    拖动事件

    NSRunLoopCommonModes    是一个模式集合,当绑定一个事件源到这个模式集合的时候就相当于绑定到了集合内的每一个模式。

    在主线程启动一个计时器Timer,然后拖动UITableView或者UIScrollView,计时器不执行。这是因为,为了更好的用户体验,在主线程中 Event Tracking 模式的优先级最高。在用户拖动控件时,主线程的Run Loop是运行在Event Tracking Mode下,而创建的Timer是默认关联为Default Mode,因此系统不会立即执行Default Mode下接收的事件。解决方法:

要么加到集合中的每一个模式,要么就和UITableView一样的 Tracking 模式下。

未完待续,后面会实践中学习并更新上来

相关文章

  • NSRunLoop

    前言 RunLoop的初期学习总结,后续会持续研究更新。 一、Runloop定义及作用 1. 什么是Runloop...

  • RunLoop学习总结

    RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程。RunLoop就是控制线程...

  • RunLoop学习总结

    简介 Runloop可以保证程序会一直运行并且时时刻刻在等待用户的输入操作。RunLoop可以在需要的时候运行,在...

  • Runloop学习总结

    什么是Runloop · 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让...

  • RunLoop学习总结

    什么是RunLoop 从字面上看,就是运行循环,跑圈 其实它内部就是do-while循环,在这个循环内部不断地处理...

  • RunLoop学习总结

    通过以下文章学习记录 关于Runloop的原理探究及基本使用 深入理解RunLoop RunLoop完全指南 Ru...

  • GeekBand - iOS 多线程和RunLoop 总结

    iOS 开发高级进阶 第三周 多线程 Runloop iOS 多线程以及 RunLoop 学习总结 基础知识 什么...

  • RunLoop的一些学习与总结

    最近在学习一些OC底层的东西, 下面是学习了RunLoop的一些总结和感受^^ 首先,RunLoop的作用 从字面...

  • RunLoop学习与总结

    RunLoop一个运行循环保持程序的持续运行监听处理 APP 各种事件(触摸,定时器,selector)节省 CP...

  • RunLoop

    RunLoop 文章已经很多了,结合各大文章做个总结 什么是 RunLoop RunLoop 人如其名,run 跑...

网友评论

    本文标题:RunLoop学习总结

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