RunLoop

作者: 流沙3333 | 来源:发表于2017-03-02 16:56 被阅读8次

    一、什么是RunLoop ?

    1.从字面意思看,就是:运行循环,跑圈。

    2、其实它内部就是do-while循环,在这个循环内部不断的处理各种任务(比如source,Timer,Observer)。

    3.一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动(调用run方法);

    4.RunLoop只能选择一个Mode启动,如果当前Mode没有任何source,Timer,Observer,那么就直接退出RunLoop。

    二、自动释放池什么时候释放?

    在RunLoop睡眠之前释放(KCFRunLoopBeforeWaiting),在进入RunLoop时创建。

    三、在开发中如何使用RunLoop?什么应用场景?

    1.开启一个常驻线程,让一个子线程不进入消亡状态,等待其他进程发来消息,处理其他事件;在子线程中开启一个定时器;在子线程中进行一些长期监控。

    2.可以控制定时器在特定模式下执行。

    3.可以让某些事件、行为、任务在特定的模式下执行。

    4.可以添加Observer监听RunLoop的状态,比如监听事件的处理(在所有点击事件之前做一些事情)。

    四、CFRunLoopModeRef代表RunLoop的运行模式

    一个RunLoop包含若干个Mode,每个Mode又包含若干个Source/Timer/Observer

    每次RunLoop启动时,只能指定其中一个Mode,这个Mode被称作CurrentMode

    如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入

    这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响

    五、系统默认注册了5个Mode:

    kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行

    UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响

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

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

    kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode,在kCFRunLoopDefaultMode模式情况和UITrackingRunLoopMode情况都会运行。

    六、RunLoop处理逻辑-网友整理版

    相关文章

      网友评论

          本文标题:RunLoop

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