iOS:runloop
2020-11-14 本文已影响0人
Liu____
CFRunloop 优化TableView加载高清大图UI卡顿问题。单独分批加载
https://cloud.tencent.com/developer/article/1383376
https://www.jianshu.com/p/d260d18dd551
- RunLoop 实际上是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行。
- RunLoop 在没有事件处理的时候,会使线程进入睡眠模式,从而节省 CPU 资源,提高程序性能。
runloopmode
总共是有五种CFRunLoopMode:
kCFRunLoopDefaultMode:默认模式,主线程是在这个运行模式下运行
UITrackingRunLoopMode:跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响)
kCFRunLoopCommonModes:伪模式,(kCFRunLoopDefaultMode,UITrackingRunLoopMode的合集)
UIInitializationRunLoopMode:在刚启动App时第进入的第一个 Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode:接受系统内部事件,通常用不到
runloop理解
1,runloop为死循环
2,主线程在main函数开启
3,UITableView滚动加载图片优化
[cell performSelector:@selector(setImage:) withObject:nil afterDelay:0.1 inModes:@[NSDefaultRunLoopMode]];
4,定时器
NSTimer *timer = [NSTimerscheduledTimerWithTimeInterval:.2target:selfselector:@selector(timerDone) userInfo:nilrepeats:YES];
[[NSRunLoopcurrentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
5,子线程需要开启runloop
NSTimer *timer = [NSTimerscheduledTimerWithTimeInterval:.2target:selfselector:@selector(timerDone) userInfo:nilrepeats:YES];
[[NSRunLoopcurrentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
6,关闭runloop
self.runLoop = CFRunLoopGetCurrent();
[[NSRunLoop currentRunLoop] run];
// 关闭runloop
CFRunLoopStop(self.runLoop);// 关闭保持前后一致