一、Runloop作用:
1、保证程序不退出,是个死循环
2、负责监听事件:触摸(UI界面的交互(优先级是最高的)),时钟,网络 runloop优先处理UI事件
3、负责渲染屏幕上的所有UI(一次runloop循环需要渲染屏幕上所有UI变化的点)
二、Runloop有两种模式,做UI是一种,timer的是另一种
[[NSRunLoop currentRunLoop] addTimer:timer forMode:<#(nonnull NSRunLoopMode)#>]
这个方法里NSRunLoopMode就是要选择Runloop的模式,这两种模式默认处理如下事件:
1、DefaultRunLoopMode 时钟,网络事件
2、RunLoopCommonModes 用户交互模式:UI处理,这个模式里不能做耗时操作,UI会卡顿),可以把timer放在UI的这个模式下面,但是timer方法里面不能放耗时操作
三、Runloop应用
tableview的性能优化的一个点:cell上的内容加载优化
加载图片我们都是使用的SD,网络加载因为是比较耗时的操作,所以我们把它丢在子线程中加载,更新UI放在主线程中,但如果更新UI也是一个耗时操作怎么办?比如cell上加载高清图片,我们会发现在滚动tableview的时候UI会卡顿,这是为什么呢?前面也说过,一次runloop循环需要渲染屏幕上所有UI变化的点,因为图片很大,一次又加载很多图,多以这次Runloop循环有点久,造成了卡顿,解决方法思路:一次runloop加载一张图,使用block。开辟一个数组,用来装加载图片的代码,注意是把代码放进去哦,在返回cell的数据源方法中,把加载图片的代码放到数组里,使用block把加载图片的代码带进去,监听每次runloop(CFRunLoop CFRunLoopObserberRef是对runloop做监听的),一次循环就从数组中拿出代码执行,并且定义数组最多放多少张图片(比如一个页面的)