加载完成后显示UIImageView

ibonddedicate

目前,我有一个缩略图的集合视图,在按下该缩略图时,它应该调用一个函数,该函数将通过API检索Image数据,并通过隐藏的ImageView显示完整图像。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            dataManager.downloadAttachment(id: attachments[indexPath.row].attachmentID)
            if dataManager.dataHolder != nil {
                attachmentImage.image = UIImage.init(data: dataManager.dataHolder!)
                attachmentImage.isHidden = false
            }
            print(attachments[indexPath.row].attachmentID)
        }

func downloadAttachment(id:Int) {
    let finalUrl = "\(urlAttachment)\(id)/data"
    if let url = URL(string: finalUrl){
        var request = URLRequest(url: url)
        request.setValue(apiKey, forHTTPHeaderField: header)
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: request) { (data, response, error) in
            if error != nil {
                print(error!)
                return
            }
            print("Attachment Downloaded")
            self.dataHolder = data
        }
        task.resume()
    }
}

明显的问题是图像不会在第一次尝试时显示,因为它仍将在检索图像并且dataHolder仍为nil,但是如果我轻按两次该单元格,则图像将正确显示。

是否有一种简单的方法,也许只需轻按一次,使其显示一个占位符,直到完成下载并相应地用实际图像更新占位符?或任何其他适当的方式来解决这个问题?

鲁皮什

您可以使用闭包来实现所需的功能。更新后的代码如下所示。

func downloadAttachment(id:Int,completionHandler completion: @escaping ((Data)->Void)) {
let finalUrl = "\(urlAttachment)\(id)/data"
if let url = URL(string: finalUrl){
    var request = URLRequest(url: url)
    request.setValue(apiKey, forHTTPHeaderField: header)
    let session = URLSession(configuration: .default)
    let task = session.dataTask(with: request) { (data, response, error) in
        if error != nil {
            print(error!)
            return
        }
        print("Attachment Downloaded")
        self.dataHolder = data
        completion()
    }
    task.resume()
  }
}

现在在collectionViewDidSelectItemAt中进行此更改

func collectionView (_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
      dataManager.downloadAttachment(id: attachments[indexPath.row].attachmentID,completionHandler: { data in
        if let cell = collectionView.cellForItem(at: indexPath),
                      let data = dataManager.dataHolder,
                      let image = UIImage.init(data: data){
            attachmentImage.image = image
            attachmentImage.isHidden = false
            }
     })
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章