我正在使用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。)重建并运行应用程序后,它完全正常。
也许我需要清除Alamofire cach?
答案 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()