美文网首页
iOS 底层 - runloop开发中的应用

iOS 底层 - runloop开发中的应用

作者: 水中的蓝天 | 来源:发表于2020-04-06 14:53 被阅读0次

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !

    在实际开发中可能会应用到下面场景:

    • 控制线程生命周期(线程保活)
    • 解决NSTimer在滑动时停止工作的问题
    • 监控应用卡顿
    • 性能优化

    控制线程生命周期(线程保活)

    AFN 2.0 版本框架中就用到了控制线程生命周期这样的技术,基本逻辑:
    创建一个子线程,让它一直在内存中不死;在某一刻需要这个子线程做事情就会告诉它去做事,等一会又需要这个子线程干什么就会让它去干;这种情况主要用于频繁需要子线程处理事情的场景下。为了避免频繁的重复创建销毁线程才会这么做 !


    注意:

    NSRunLoop的run方法([[NSRunLoop currentRunLoop] run])是无法停止的,它专门用于开启一个永不销毁的线程; 但是如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop还是会立刻退出得 !

    [[NSRunLoop currentRunLoop] run];底层是调用runMode:beforeDate:方法,相当于是:
     while (1) {
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
     }
    


    调用CFRunLoopStop(CFRunLoopGetCurrent());不能做到真正停止它,这样只能是停止其中一次的执行,因为while 循环条件是1,这表示永远成立根本停不下来。
    所以如果没必要就不要轻易去使用 [[NSRunLoop currentRunLoop] run]

    • 线程保活封装实现

    知识点

    /**
        wait = YES 就表示self.thread线程的test方法执行完了才会继续执行后面的代码
        wait = NO  就表示不需要等,继续执行后面代码
        */
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
    

    C语言实现线程保活
    OC实现线程保活

    解决NSTimer在滑动时停止工作的问题

    设置定时器的Mode为:NSRunLoopCommonModes

     // NSDefaultRunLoopMode、UITrackingRunLoopMode才是真正存在的模式
        // NSRunLoopCommonModes并不是一个真的模式,它只是一个标记
        // timer能在_commonModes数组中存放的模式下工作
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
        
    

    注意:NSTimer计时时间准确性是不能够保证的,因为他是在RunLoop中处理的,一旦RunLoop正在忙着处理其他事情,等处理完了再来处理NSTimer的时候时间可能就已经过去了 !对于计时推荐使用系统的计时API--- >

    监控应用卡顿

    性能优化

    iOS 底层 - 性能优化之CPU、GPU
    iOS 底层 - 性能优化之启动和电池能耗
    iOS 底层 - 性能优化之安装包瘦身(App Thinning)

    相关文章

      网友评论

          本文标题:iOS 底层 - runloop开发中的应用

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