美文网首页
runloop相关

runloop相关

作者: 埃辛诺斯忍 | 来源:发表于2021-01-26 15:46 被阅读0次

    整理一下自己学到的知识,方便以后查看

    runloop 和线程的关系:

    1. 主线程的run loop默认是启动的。

    iOS的应用程序里面,程序启动后会有一个如下的main()函数

    int main(int argc, char * argv[]) {
    @autoreleasepool {    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
    }
    

    重点是UIApplicationMain()函数,这个方法会为main thread设置一个NSRunLoop对象,这就解释了:为什么我们的应用可以在无人操作的时候休息,需要让它干活的时候又能立马响应。

    1. 对其它线程来说,run loop默认是没有启动的,如果你需要更多的线程交互则可以手动配置和启动,如果线程只是去执行一个长时间的已确定的任务则不需要。

    2. 在任何一个 Cocoa 程序的线程中,都可以通过以下代码来获取到当前线程的 run loop 。

    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    

    runloop的mode作用

    mode 主要是用来指定事件在运行循环中的优先级的,分为:

    NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态

    UITrackingRunLoopMode:ScrollView滑动时

    UIInitializationRunLoopMode:启动时

    NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合

    苹果公开提供的 Mode 有两个:

    NSDefaultRunLoopMode(kCFRunLoopDefaultMode)

    NSRunLoopCommonModes(kCFRunLoopCommonModes)

    常见题:以+ scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?
    RunLoop只能运行在一种mode下,如果要换mode,当前的loop也需要停下重启成新的。利用这个机制,ScrollView滚动过程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode会切换到UITrackingRunLoopMode来保证ScrollView的流畅滑动:只能在NSDefaultRunLoopMode模式下处理的事件会影响scrllView的滑动。

    如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。

    同时因为mode还是可定制的,所以:

    Timer计时会被scrollView的滑动影响的问题可以通过将timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)来解决。

    相关文章

      网友评论

          本文标题:runloop相关

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