一. 问题布景
项目中遇到一个问题,就是当App
不在主页的时分,切换到其他App
比方微信,然后回来App
当时页面,然后从当时页面回来主页,会在主页viewWillAppear
这儿去拉取是否有未完成订单的接口,改写UITableView
,这时会呈现广告位闪耀问题。
二. 问题排查
1.原因剖析
这个问题经过断点调试和排除法,发现只需当App
进入后台后,回来改写主页的UITableView
都有或许呈现闪耀现象。
因而首要咱们对图片的加载做推迟操作,并在Cell
生成办法调用里边增加相关打印:
能够看到如下打印日志:
从打印日志咱们能够看出来,调用reloadData
办法后,本来UITableView
的cell
位置会调整。
但是假如咱们App
没有进入后台,而是直接调用UITableView
的reloadData
办法,并不会呈现闪耀现象。
因而能够这儿能够估测应该是进入后台做了什么操作导致,回到App
改写才会导致闪耀。
因为运用的是SDWebImage
加载结构加载,咱们合理的怀疑是加载图片的SDWebImage
结构,进入后台的处理逻辑导致的,因而咱们先运用imageCacheDict字典
写下图片加载和缓存逻辑:
经测试,进入后台,再回来App
改写不会呈现闪耀现象。
因而能够必定UITableView
调用reloadData
办法闪耀原因是SDWebImage
,在进入后台的时分对内存缓存做了相关操作导致。
咱们都知道SDWebImage
,默许是运用NSCache
来做内存缓存,而NSCache
在进入后台的时分,默许会清空缓存操作,导致回来App
调用UITableView
调用reloadData
办法时分,SDWebImage
需要依据图片地址从头去磁盘获取图画数据,然后解压解码烘托,因为是从缓存磁盘直接获取图画数据,没有烘托流程,因而会形成闪耀。
为了验证这个猜想,咱们运用YYWebImage
加载结构来做对比实验:
- 首要注释掉
YYWebImage
进入后台清空内存缓存的逻辑:
- 然后进入后台,回来
App
调用UITableView
调用reloadData
改写,发现一切正常。
-
原因总结:
-
第一个原因是
UITableView
调用reloadData
办法,因为UITableViewCell
的复用,会呈现Cell
位置调整现象 -
因为
SDWebImage
运用了NSCache
做内存缓存,当App
进入后台,NSCache
会清空内存缓存,导致回来App
后调用UITableView
调用reloadData
,改写去加载图片的时分,需要从SDWebImage
的磁盘中从头获取图片数据,然后从头解压解码烘托,因为从磁盘中读取速度快,两者原因导致了闪耀。
三. 解决方案
因为该现象是由如上两个原因导致,因而针对这两个原因,有如下两种解决方案:
- 解决
UITableViewCell
复用问题
能够经过设置ReusableCellWithIdentifier
不同,保证广告cell
不进行复用。
NSString *cellId = [NSString stringWithFormat:@"%ld-%ld-FJFAdTableViewCell", indexPath.section, indexPath.row];
- 从后台回来后,提前进行改写操作
当从后台回来App
前台的时分或许视图增加到父视图的时分,先履行下UITableView
调用reloadData
办法,提前经过SDWebImage
去从磁盘中加载图片。
从后台回来前台:
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(willEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
- (void)willEnterForeground {
[self.tableView reloadData];
NSLog(@"--------------------------willEnterForeground");
}
视图增加到父视图:
- (void)willMoveToParentViewController:(UIViewController *)parent {
[self.tableView reloadData];
}