美文网首页
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开发中的应用

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...

  • Runloop

    Runloop 实现原理及应用iOS - RunLoop 底层源码详解及具体运用

  • RunLoop

    详情见: iOS中的RunLoop 1、什么是RunLoop?2、开发中如何使用RunLoop?什么应用场景?3、...

  • iOS底层原理——浅谈RunLoop

    RunLoop应用:线程保活 线程保活、控制销毁 iOS-浅谈RunLoop8iOS底层原理总结 - RunLoo...

  • 多线程简介

    iOS系统 中,每一个应用都是一个进程。具体了解Runloop底层原理:https://www.jianshu.c...

  • 多线程简介

    iOS系统 中,每一个应用都是一个进程。具体了解Runloop底层原理:https://www.jianshu.c...

  • iOS开发的书籍,研究下runloop底层与mach,bsd,之

    iOS开发的书籍,研究下runloop底层与mach,bsd,之间的关系都找不

  • 深入理解RunLoop

    RunLoop是iOS开发中非常底层的一个概念,我们来看看runloop的实现原理,然后结合实例讲解下runloo...

  • RunLoop -- 相关问题的总结

    1、RunLoop在实际场景的应用 RunLoop -- 在实际开发中的应用 2、RunLoop内部实现逻辑 Ru...

  • iOS底层面试题--RunLoop

    什么是RunLoop? iOS底层面试题--RunLoop RunLoop面试题分析

网友评论

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

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