Firebase& Alamofire Url TableViewCell图片加载问题Swift 4

时间:2018-04-24 07:56:07

标签: ios swift firebase swift4

我正在使用tableViewCell

将图片设置到Alamofire
let messageImage = cell?.viewWithTag(6) as! UIImageView
messageImage.image = nil
messageImage.af_setImage(withURL: photoUrl! as URL)

return cell

我使用Firebase将每个单元格项附加到数组:

ref.child("messages").child(ticker.current).queryOrderedByKey().observe(.childAdded, with: {snapshot in

            let snapDict = snapshot.value as? NSDictionary
            let photoUrl = snapDict?["photo_url"] as? String ?? ""

            messageArray.insert(messageCellStruct(photoUrl: photoUrl), at: 0)
         })

然后我使用FirebaseStorage

更新相同的精确网址上的图片

当我重新调用ViewController所在的单元格TableViewCell时,前几个单元格中的图像不会更改。但是当我滚动到较旧的单元格时,图像会更新:

messageArray.removeAll()
tableView.reload()

如果我重建应用程序,所有单元格图像都是它们应该是的样式。

我假设这是因为Observer错误或我不是删除观察者。我真的不知道。

1。)小组共享完全相同的网址我只是更改数据。

2。)它似乎仅在单元格尚未加载(或已分配)时才起作用。

3。)重建并运行应用程序后,它完全正常。

enter image description here

也许我需要清除Alamofire cach?

2 个答案:

答案 0 :(得分:0)

messageImage.af_setImage(withURL: photoUrl! as URL)中设置图像之前,您需要将旧图像设置为nil。

Cell应该在重复使用之前得到清理:Apple -PrepareForReuse但Apple还说:

  

出于性能原因,您应该只重置单元格的属性   与内容无关的内容,例如,alpha,编辑和   选择状态。表格视图的代表   tableView(_:cellForRowAt :)应始终重置所有内容   重用一个单元格。

这基本上意味着你不应该在prepareForReuse中将你的imageView图像设置为nUT但是如果你对单元格进行了分类,你可以在子类内部和cellForRowAtIndePath中创建一个函数在运行messageImage.af_setImage(withURL: photoUrl! as URL)之前调用它。示例如下:

为单元格创建子类并将其命名为MyCustomCell

class MyCustomCell: UITableViewCell {

@IBOutlet weak var messageImage: UIImageView!

    func setImageToNil(){
        messageImage.image = nil
        // I don't use AlamoFire and don't know anything about it but if they have something to set the imageView's image to nil you can also try using that instead
    }
}

在您的tableView cellForRowAtIndexPath内部投放该单元格,然后在您setImageToNil()

之前致电messageImage.af_setImage
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     // 0. cast the cell as MyCustomCell
     let cell = tableView.dequeueReusableCell(withIdentifier: "MyCustomCell", for: indexPath) as! MyCustomCell

     // 1. call the setImageToNil() method and whatever image is inside messageImage will get set to nil every time the cell is reused
     cell.setImageToNil()

     // 2. the new image should always appear because the old image was set to nil
     cell.messageImage.af_setImage(withURL: photoUrl! as URL)

     return cell
}

答案 1 :(得分:0)

Alamofire在本地保存图像缓存。

因为我要将数据更改为相同的精确网址,所以我必须删除缓存。

 UIImageView.af_sharedImageDownloader.imageCache?.removeAllImages()

 UIImageView.af_sharedImageDownloader.sessionManager.session.configuration.urlCache?.removeAllCachedResponses()