在开发中,如果UITableviewcell中有多个网络图片,用了SDWebImage加载,滚动的时候,UITableview掉帧非常严重
目前的优化方式,是UITableView滚动时不加载网络图片,停止滚动后,只加载展现在屏幕上的cell的网络图片,使用此方法之后流畅度有明显提高,具体如下:
1 首先在uitableviewcell要加载的模型里,增加一个isLoad属性,如下
@interface CICommunityModel : CIBaseModel
@property(nonatomic,copy)NSString *id;
@property(nonatomic,copy)NSString *micFilePath;
@property(nonatomic,assign)BOOL isLoad;
@end
2 网络请求下来模型属性赋值的时候isLoad直接设置为false
3uitableview代理返回cell的方法里代码如下
CICommunityModel *model = self.tabArray[indexPath.row];
if (indexPath.row<2) {
//前三个必须加载
[model setIsLoad:YES];
}
if (model.isLoad) {
[cell setImageWithModel:model];//此方法里设置SDWebImage加载图片
}else{
[cell setImageWithModel:nil];
}
4在cell的 setImageWithModel方法里加载网络图片,加载完成之后把model里的isLoad设置为true
[self.contentImg sd_setImageWithURL:[NSURL URLWithString:media.micFilePath] placeholderImage:CIImage(@"placeholderimg") completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
[model setIsLoad:YES];
}];
5tableview滚动停止的时候加载在屏幕中的cell中相应的网络图片
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if(scrollView==self.tableView){
[self loadShowCells];
}else{
}
}
6首先找到展示在屏幕里的cell ,然后调用cell里的setImageWithModel方法加载网络图片
-(void)loadShowCells{
NSArray * array = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *indexPath in array) {
CIVideosListTableCell * cell = (CIVideosListTableCell *)[self.tableView cellForRowAtIndexPath:indexPath];
CICommunityModel *model = self.tabArray[indexPath.row];
[cell setImageWithModel:model];
}
}