Swift 3 图片下载不完全

Swift 3 Image download not working fully

因此,经过 5 小时的坚定宣誓,我终于设法将我的项目从 Swift 2.2 转换为 Swift 3。事情建立了,现在一切都精明了,只有一个小例外。

由于某些原因,我的图像没有像以前那样异步下载。

我录制了一个小视频给你看,还有一些代码示例。我正在尝试 AlamofireImage 和一个普通的 ole Swift 扩展,两者都给出相同的行为。正如您在视频中看到的那样,最初图像根本不加载(我还注意到由于某种原因默认占位符图像最初不显示)当我拉动以刷新视图时它们突然出现。

如果有人看到类似的东西,如果可能的话,我将不胜感激。

视频是here

代码示例如下: 扩展函数

 func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
    contentMode = mode
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
            let data = data, error == nil,
            let image = UIImage(data: data)
            else { return }
        DispatchQueue.main.async() { () -> Void in
            self.image = image
        }
        }.resume()
}   

func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {
    guard let url = URL(string: link) else { return }
    downloadedFrom(url: url, contentMode: mode)
}

另外我对一个单元格使用 AlamofireImage 只是为了测试

    if nc.returnCommentDetails().image != "" {
        let url = URL(string: nc.returnCommentDetails().image!)
        cell.imgProfile.af_setImage(withURL: url!)
        cell.imgProfile.resizeForProfilePic()
    }

经过深思熟虑,我找到了问题的根本原因。

我写的用于使图像视图循环的扩展基本上有问题,通过评论图像看起来很好。

如果有人使用类似的东西,我会调查并提供替代方案:

func resizeForProfilePic(){
    self.layer.borderWidth = 0.1
    self.layer.masksToBounds = false
    self.layer.borderColor = UIColor.black.cgColor
    self.layer.cornerRadius = self.frame.height/2
    self.clipsToBounds = true
}

用AlamofireImage好像已经解决了

let url = URL(string: nc.returnCommentDetails().image!)
let placeholderImage = UIImage(named: "DefaultImage")!
let size = CGSize(width: 100.0, height: 100.0)
let imageFilter = AspectScaledToFillSizeCircleFilter(size: size)
cell.imgProfile.af_setImage(withURL: url!, placeholderImage: placeholderImage, filter: imageFilter)

要解决此问题,只需在 layer.cornerRadius

之前添加此行
self.view.layoutIfNeeded()

然后所有图像都显示为第一次加载