美文网首页
Runloop初识

Runloop初识

作者: 似奔跑的野马 | 来源:发表于2017-05-17 11:42 被阅读0次

    一、作用:

    1.保证程序持续运行

    处理APP中的各种事件(如触摸事件、定时器事件、Selector事件)

    节约cup资源,提高程序性能。该做事做事,该休息休息

    每个线程都有一个唯一与之对应的runloop 对象

    二、获取runloop

    [NSRunLoopcurrentRunLoop];都会获取也当前线程管理的runloop ,默认情况下,子线程是没有开启runloop的。

    2.runloop 需要手动开启 ,可以调用 run  方法。

    3.不同的runloop运行对应不同的mode 模式

    kCFRunLoopDefaultMode 默认主线程在这个mode下执行

    UITrackingRunLoopModel 界面跟踪model,用于scrollView 跟踪触摸滑动,保证界面滑动不受其他model影响。

    UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用

    GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到

    kCFRunLoopCommonModes  是通用模式,是一个占位标记(kCFRunLoopDefaultMode和UITrackingRunLoopModel)本身不是真正的model.

    4.程序启动后,默认开启一个主运行循环,进行处理事件,保证程序持续运行,不退出。

    三、souce分类

    按调用栈分为:

    1>source0  非基于port

    2>source1基于port,通过内核和其他线程通信,接收、分发系统事件。

    四、什么是runloop

    1.字面就是运行循环,本质就do-while,循环处理各种事件(如timer、控件的点击、拖拽、port)

    2.每个线程都有一个唯一与之对应的runloop,主线程由系统自己创建,不断循环处理各种事件,子线程的runloop需要获取,并且启动,调用对应的run方法。

    3.runloop对应的mode如果没有timer、、source0或者source1时, 就会立即退出。(如果单有观察者也会退出)

    4.gcd的dispatch_after 延迟执行不受 mode影响。

    子线程的runloop默认不启动

    runloop的使用场景:

    1.开启一个常驻线程(让一个字线程不进入消亡状态,等待其他线程发来消息,处理其他事件)

    iOS 利用RunLoop创建一个常驻线程

    子线程中开启一个定时器

    子线程中进行一个长期监控

    2.使timer 运行在不同的mode模式下

    3.设置特定的mode,处理不同的任务、行为

    autoreleaspool什么时候销毁?

    通过observer监听runloop的状态,当进入休眠的时候,销毁当前的autoreleaspool

    五、runloop 处理逻辑

    Runloop源码地址

    相关文章

      网友评论

          本文标题:Runloop初识

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