iOS 底层 - runloop开发中的应用

2020-04-06  本文已影响0人  水中的蓝天

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

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

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

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)

上一篇 下一篇

猜你喜欢

热点阅读