如何使用 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 进行解析