现在有这样一个场景,有一个tableview,每个cell上都有imageView,imageView要加载图片,用户在滑动列表的时候,如果随滑随加载图片的话,列表会非常卡顿,验证影响用户体验。这个时候应该怎么优化呢?
方法一:利用UIScrollView的代理方法。在tableView滑动的过程中不加载图片,等停止滑动时再加载当前可见cell上的图片。这种方法是比较容易想到的优化方式,但是实现起来比较麻烦,要判断是否拖动,是否正在减速等条件,要在多个方法中做相应的设置,具体细节实现网上也有很多,大家可以自行查找,不在这里赘述。这种虽然也能实现优化,但就是感觉非常的笨重,那有没有更简便的方法,答案当然是有,什么?你就想一行代码实现?哈哈,这个当然也是so easy!
方法二:利用runloop的特性。(五星推荐)
UIImage *cellImg = ...;
[self.imgView performSelector:@selector(setImage:) withObject:cellImg afterDelay:0 inModes:@[NSDefaultRunLoopMode]];
Runloop这个东西还是推荐学习一下的,研究runloop的过程中,会让我们对iOS的底层有更多的认识。当然runloop的内容比较多也比较抽象,这里推荐ibireme大神的文章,可以说是讲的非常深入,有兴趣的可以研究一下。等你看完整个runloop的原理,可以再来看这里的优化方式。
说回这种优化方式,它的意思就是将设置图片的操作放在Default Mode的runloop中,因为tableview在滑动时,所在的runloop的mode为UITrackingRunLoopMode,这是两种完全不同的Mode,且水火不容。滑动时,只会执行设置为UITrackingRunLoopMode的runloop,故而设置为NSDefaultRunLoopMode的runloop就不会执行,只有停止滑动的时候才会自动切换到NSDefaultRunLoopMode,这时就会去设置图片了。怎么样,这操作是不是有点厉害呢?