【问题标题】:Showing UIImageView after finished loading加载完成后显示 UIImageView
【发布时间】:2020-06-12 16:10:12
【问题描述】:

目前我有一个缩略图图像的集合视图,按下该缩略图图像单元格后,它应该调用一个函数,该函数将通过 API 检索图像数据并通过隐藏的 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,但是如果我点击单元格两次然后图像将正确显示。

是否有一种简单的方法可以只点击一次并使其显示占位符,直到完成下载并相应地使用实际图像更新占位符?或者任何其他适当的方法来处理这个?

【问题讨论】:

    标签: swift uiimageview


    【解决方案1】:

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

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

    【讨论】:

    • 感谢它现在正在工作。不过需要添加@escaping。
    • 谢谢。忘记提了。更新了答案。
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多