如何使用 Alamofire Swift 4 将图像填充到 UICollectionView

Posted

技术标签:

【中文标题】如何使用 Alamofire Swift 4 将图像填充到 UICollectionView【英文标题】:How to fill images in to UICollectionView with Alamofire Swift 4 【发布时间】:2018-03-28 08:12:41 【问题描述】:

我有一个聊天记录,它只是一个UICollectionView。每个销售都有一个头像 (UIImage) 和一个文本气泡。我正在尝试通过使用 Alamofire 从服务器获取头像 URL 来用正确的图像填充头像,如下所示:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "chatMessage", for: indexPath) as! ChatMessageCell

    let imageURL = URL(string: messagesArray![indexPath.item].userAvatar)
            Alamofire.download(imageURL!).responseData  response in
                if let data = response.result.value 
                    cell.userAvatar.image = UIImage(data: data)
                
            

    cell.messageText.text = messagesArray![indexPath.item].userText

我的问题:在某些单元格中头像出现在某些不是。我认为这与 Alamofire 异步工作有关。所以我的问题是如何正确地将图像填充到UICollectionView 以显示每个单元格中的每个头像?

【问题讨论】:

你觉得呢?你做了任何调试吗?您是否确认所有调用都成功,您正在取回数据并为它们创建图像? 您应该考虑创建一个带有活动指示器的视图。在进行网络呼叫之前,请调出此视图并激活活动指示器。这是标准做法。当网络调用完成时,停止指示器,关闭视图,然后重新加载该点的数据。 【参考方案1】:

我认为最好使用 SDWebImage ,因为根据您当前的实现,图像获取会发生多次

imageView.sd_setImage(with: URL(string: "http://www.example.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png"))

这里SDWebImage

【讨论】:

【参考方案2】:

UICollectionView 重用现有单元格。如果您有一个包含一百万个单元格的 collectionView,则不会实例化一百万个 UICollectionView 单元格,但它们在滚动时会被重用。现在您的结果回调块可能会设置相同单元格的图像。

要解决您的问题,您需要缓存图像。关于这个主题有多个教程。

【讨论】:

是的,你是对的。你比我的问题更进一步。我用@Sh_Khan 回答解决了当前问题。但是知道我看到我的单元格在滚动时开始呈现不同的效果。

以上是关于如何使用 Alamofire Swift 4 将图像填充到 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire,Swift 4 为 UICollectionView 获取 JSON 数据

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

如何在 Swift 4 中使用 Alamofire 上传具有其他参数的多个图像

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

如何使用 Alamofire Swift 4 在 JSON 编码中传递数据

如何使用 Alamofire Swift 4 将图像填充到 UICollectionView