【问题标题】:Firebase & Alamofire Url TableViewCell image load Issue Swift 4Firebase 和 Alamofire Url TableViewCell 图像加载问题 Swift 4
【发布时间】:2018-04-24 07:56:07
【问题描述】:

我正在使用Alamofire 将图像设置到tableViewCell

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)
         })

然后我将 Same Exact URL 上的图片更新为 FirebaseStorage

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

messageArray.removeAll()
tableView.reload()

如果我重新构建应用程序,所有单元格图像都是应有的样子。

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

1.) 单元格共享完全相同的 URL,只是更改了数据。

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

3.) 在我重建并运行应用程序后,它工作得非常好。

也许我需要清除 Alamofire 缓存?

【问题讨论】:

    标签: ios swift firebase swift4


    【解决方案1】:

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

    Cell 应该在重新使用之前进行清理:Apple -PrepareForReuse 但 Apple 也表示:

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

    这基本上意味着您不应该在prepareForReuse 中将您的imageView 的图像设置为零,但是如果您对单元格进行子类化,您可以在子类中创建一个函数并在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 中投射单元格,然后在运行 messageImage.af_setImage 之前调用 setImageToNil()

    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
    }
    

    【讨论】:

    • 更新我已经这样做了。我想不通。当我向 Firebase 发布更新时它会发生变化,但不会更改旧图像。
    • 我认为 Alamofire 会在本地缓存图像,这可能是原因。我需要做更多的研究。
    • 可能 alamofire 正在缓存并以某种方式显示旧图像???你试过 SDWebImage 吗?效果很好cocoapods.org/pods/SDWebImage
    • 试试这个 SO q&a,其他人也有同样的问题:stackoverflow.com/q/33467263/4833705
    • 我觉得我会遇到同样的问题,它将其存储在本地。我想我发现了我的问题。我需要清除缓存。
    【解决方案2】:

    Alamofire在本地保存图片缓存。

    因为我将数据更改为 完全相同的 URL,所以我不得不删除缓存。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2017-08-31
      相关资源
      最近更新 更多