SDWebImage加载图片在cell上显示混乱

在使用,SDWebImage加载图片的时候,出现图片加载混乱,具体情况是

1> 从服务器获取数据,如果返回的数组有数据即图片地址,则没有问题,如果数组为空那么,这个空数组展示的cell则会出现图片加载紊乱。
2> 我用的SDWebImage加载图片的方法是:
[backgImgView sd_setImageWithURL:[NSURL URLWithString:propertyImgs[i]] placeholderImage:[UIImage imageNamed:[Utils imageNameStr:@"PlaceHolder"]]];

具体使用到的函数:

 for (int i = 0; i < propertyImgs.count; i++) {
            
      UITapGestureRecognizer *backgImgViewTapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgImgViewTapGRAction:)];
            backgImgViewTapGR.numberOfTapsRequired  = 1;
            //    backgImgViewTapGR.numberOfTouchesRequired = 1;
            
     UIImageView *backgImgView = [[UIImageView alloc] init];
      backgImgView.userInteractionEnabled = YES;
            [backgImgView addGestureRecognizer:backgImgViewTapGR];
            
          
            
            
            [backgImgView sd_setImageWithURL:[NSURL URLWithString:propertyImgs[i]] placeholderImage:[UIImage imageNamed:[Utils imageNameStr:@"PlaceHolder"]]];
            

            
            backgImgView.frame = CGRectMake(i*Kwidth, 0, Kwidth, scrollContainerView.frame.size.height);//i*Kwidth
            [scrollContainerView addSubview:backgImgView];

            lastImgView = backgImgView;
        }

图片描述

阅读 8.5k
4 个回答

题主这个问题让我很疑惑,题主写的这个列表视图,可能使用了用tableView,在cell中嵌套了ScrollView,所以我觉得题主可能是在做一个Cell可以横向滑动的滚动tableView,如果真是这样的话,题主这段加载UIImageView的代码可能是在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法里,代码篇幅有限,不知道题主有没有在每次执行这段代码前,移除scrollContainerView中旧的ImageView

UITableViewCell是有复用机制的,可以有效节省内存开销。所谓的复用机制,就是我们使用的

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

生成的cell,其实不一定是一个新实例,例如你当前屏幕总共可以显示3个cell(如你的图),那你的内存中,可能只有4个cell实例,在不停的循环调用。

所以当你的服务器出现返回空数组的情况时,for循环不执行,但是scrollview中的别的数组的图还在内存中并未清除,所以出现了你所谓的混乱。

如果返回不空,你新创建的UIImageView覆盖了旧的,所以看起来是对的,但是内存在不断增加没有释放。

解决办法:你自己想吧,我也不清楚你完整的代码,只是猜测一下原因。提亮点建议

1 你的scrollContainerView在for循环前面,把所有UIImageView移除掉。

[scrollContainerView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [obj removeFromSuperview];
}]

2 更好的办法是,好好研究一下复用机制,参考著名的nimbus框架的NIViewRecycler类,或者直接拿来用,把你的UIImageView也复用了。可能需要花点时间,但弄明白以后绝对值得。

ps:这个问题跟SDWebImage半毛钱关系都没有。

显示混乱和这个下载图片的 函数也没关系吧。

试下用带 completed 的方法

图片加载完之后调用一下 cell 的 layoutSubviews

我用过类似的Swift的框架,也有类似的问题,不过稍微一下就又会现实正确的图片。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题