转载本文需注明出处:微信公众号EAWorld,违者必究。
引言:
1、RunLoop的概念
3、RunLoop的常用模式
RunLoop在TableView中的应用(解决滑动卡顿问题)。
如图代码展示,当加载高清大图渲染屏幕,而此时不得不在主线程操作,会引起滑动的卡顿。
tableview 在加载 cell 时如果遇到多个耗时操作会有点卡顿。将耗时操作放到 DefaultMode 里只能解决滑动时流畅,但是停止时需要加载耗时,仍然会有卡顿的感觉。正确方法是采用 RunLoop 监听,将多个耗时操作分开执行,在每次 RunLoop 唤醒时去做一个耗时任务。
阻塞原因:kCFRunLoopDefaultMode时候 多张图片(特别是高清大图)一起加载(耗时)loop不结束无法BeforeWaiting(即将进入休眠) 切换至UITrackingRunLoopMode来处理等候的UI刷新事件造成阻塞。
解决办法:每次RunLoop循环只加载一张图片 这样loop就会很快进入到BeforeWaiting处理后面的UI刷新(UITrackingRunLoopMode 优先处理)或者没有UI刷新事件继续处理下一张图片。
RunLoop 监听添加Observer (监听RunLoop的beforeWaiting)当处理完一张图片即将进入到beforeWaiting时处理数组里的tasks,这些任务就在callback里面做处理。
callBack拿到task处理了一部分就进入到了休眠 比如拿到18个任务只处理了7个就不处理了。
此处添加Timer是让RunLoop一直处于活跃状态 保证即使处理完所有task还是一直活跃状态。
关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。

