本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !
在实际开发中可能会应用到下面场景:
- 控制线程生命周期(线程保活)
- 解决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));
解决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)
网友评论