美文网首页
RunLoop初谈

RunLoop初谈

作者: 海上飞鸟 | 来源:发表于2020-11-11 18:15 被阅读0次

    RunLoop是iOS开发过程中非常基础的一个概念,本文就简单说下RunLoop,也算是自己做的一个笔记,如有不对之处请指出。

    RunLoop是什么?

    我们都知道一个线程在执行完它的任务之后就会退出,那如果想要执行完任务不退出,下次有任务时线程还可以正常使用。这种模型称之为Event Loop。实现这种模型的关键就在于如何让它在有任务的时候处理任务,没有任务的时候进行休眠。

    所以RunLoop就是一个对象,这个对象管理来需要处理的事件和消息。

    RunLoop_0.png

    如上图所示,RunLoop是由多个Mode组成,而每个Mode又分为若干个Source/Obsever/Timer组成。
    每次启用RunLoop时只能指定一种Mode。如果需要切换只能退出RunLoop,然后重新启动指定一个Mode。

    RunLoop的mode又哪些?

    Mode一共分为5种,如下:

    1. NSDefaultRunLoopMode:默认的Mode,通常主线程在这个Mode下运行。
    2. UITrackingRunLoopMode:对应的是UI素材UIScrollView等UI控件滑动屏幕时对应的Mode。
    3. NSRunLoopCommonModes:这是一种标记,标记成为NSDefaultRunLoopMode和UITrackingRunLoopMode。
    4. UIInitializationRunLoopMode:这种是在APP启动时进入的第一个Mode,启动完成后就不会再进入了。
    5. GSEventReceiveRunLoopMode:接受系统内部事件的Mode,开发中用不到。

    对于上面的5种Mode,后两种没有用到过。

    RunLoop的简单应用

    使用NSTimer时添加到runloop中

    第一种,也是我们经常直接使用的。

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
    

    使用这种的话,相当于系统会自动添加到runloop中,并且对应的Mode为NSDefaultRunLoopMode,当我们滑动UIScrollView等控件时,定时器方法就不执行了。

    第二种,自行添加到runloop中。

    NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
    
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    

    可以使用我们想要的Mode进行设置。

    相关文章

      网友评论

          本文标题:RunLoop初谈

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