先说我们做这个是能解决啥问题 能干啥
有时候,我们会遇到这种情况:
当界面中含有UITableView,而且每个UITableViewCell里边都有图片。这时候当我们滚动UITableView的时候,如果有一堆的图片需要显示,那么可能会出现卡顿的现象。
两种思路
第一种 用UIScrollView的代理方法实现
第二种 用RunLoop在UIScrollView滑动时和App默认运行时的运行模式不同来实现
先说第一种
UIScrollView有两个代理方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; // called when scroll view grinds to a halt
这两方法一个是停止拖拽时调用 一个是当滚动视图嘎然而止 时调用 在这两方法里面写给ImageView加载图片的方法 就能避免因为加载图片导致UITableView滚动时卡顿的问题
代码:
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
//如果tableview停止滚动,开始加载图像
if (!decelerate) {
[self loadImagesForOnscreenRows];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//如果tableview停止滚动,开始加载图像
[self loadImagesForOnscreenRows];
}
第二种
利用PerformSelector设置当前线程的RunLoop的运行模式
kCFRunLoopDefaultMode:App的默认运行模式,通常主线程是在这个运行模式下运行
UITrackingRunLoopMode:跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响)
然后 我们滑动UITableView时候 RunLoop的运行模式就会变为UITrackingRunLoopMode
所以我们把给ImageView加载图片的方法用PerformSelector设置当前线程的RunLoop的运行模式kCFRunLoopDefaultMode 这样滑动时候就不会执行加载图片的方法了
也就能避免因为加载图片导致UITableView滚动时卡顿的问题
代码
[cell performSelector:@selector(setImage) withObject:nil afterDelay:0 inModes:@[NSDefaultRunLoopMode]];
打完收工 哈哈哈