AFNetworking的setImageWithURLRequest在滚动后将图像设置在错误的单元格中(iOS,Swift)

时间:2014-08-29 14:05:30

标签: ios uitableview swift uiimage afnetworking-2

我使用dequeueReusableCellWithIdentifierafnetworking+uiimageview的表格。我的一些细胞有图像,有些没有。如果我在加载图像之前滚动我的表,成功块会将图像放入重用的错误单元格中。例如,图像在单元格#2中,但是在滚动之后它出现在单元格编号#8中,因为#8在那个时刻处于第二位置。是否可以将setImageWithURLRequestdequeueReusableCellWithIdentifier一起使用?

我的代码:

    let cell = tableView.dequeueReusableCellWithIdentifier("simpleCell", forIndexPath: indexPath) as UITableViewCell!
    cell.textLabel.text = fields[indexPath.row]["name"] as String
    cell.imageView.image = nil
    if let image = fields[indexPath.row]["image"] as? String {
        if (image != "") {
            let image_url = NSURL(string: image)
            let url_request = NSURLRequest(URL: image_url)
            let placeholder = UIImage(named: "no_photo")
            cell.imageView.setImageWithURLRequest(url_request, placeholderImage: placeholder, success: { [weak cell] (request:NSURLRequest!,response:NSHTTPURLResponse!, image:UIImage!) -> Void in
                if let cell_for_image = cell {
                    cell_for_image.imageView.image = image
                    cell_for_image.setNeedsLayout()
                }
            }, failure: { [weak cell]
               (request:NSURLRequest!,response:NSHTTPURLResponse!, error:NSError!) -> Void in
                if let cell_for_image = cell {
                    cell_for_image.imageView.image = nil
                    cell_for_image.setNeedsLayout()
                }
            })
        }
    }
    return cell

抱歉,如果我的问题与另一个问题重复。我发现了很多类似的问题,但我还没有找到解决方案。我试图添加重装

tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)

进入我的成功区块,但没有帮助。

更新: 我也注意到,当我的所有细胞都有图像时,我没有这个问题。如果我理解正确的原因是:当尝试请求新图像时,AFNetworking正在中止对同一单元格的先前请求。但如果我没有在单元格中成像,它就不会中止。我该如何手动完成?

2 个答案:

答案 0 :(得分:4)

当表格视图重复使用单元格时,图像下载仍在后台处理。完成后,cell指向具有不同内容的重用单元格。

您有两种选择:

  1. cancelImageRequestOperation
  2. 之后的图片视图上致电cell.imageView.image = nil
  3. 在完成处理程序中,不要引用cell;而是使用您的数据模型从表视图中请求正确的单元格。

答案 1 :(得分:0)

检查单元格是否可见

let visibleCells = tableView.visibleCells as NSArray
cell.imageView.setImageWithURLRequest(url_request, placeholderImage: placeholder, success: { [weak cell] (request:NSURLRequest!,response:NSHTTPURLResponse!, image:UIImage!) -> Void in
                if let cell_for_image = cell {
                    if(visibleCells.containsObject(cell)) {
                      cell_for_image.imageView.image = image
                      cell_for_image.setNeedsLayout()
                    }

                }
            }, failure: { [weak cell]
               (request:NSURLRequest!,response:NSHTTPURLResponse!, error:NSError!) -> Void in
                if let cell_for_image = cell {
                    cell_for_image.imageView.image = nil
                    cell_for_image.setNeedsLayout()
                }
            })