来自 UIImageView 的 jpegData() 为零

jpegData() from UIImageView is nil

我正在尝试从 UIImageView 中提取图像数据,以便将其上传到 Firebase 存储。但是,iv.image?.jpegData() 返回 nil。我正在使用标准 Kingfisher library 方法将图像从 URL 添加到 UIImageView

这是我的代码:

    let url = URL(string: "https://pbs.twimg.com/profile_images/1229497999392477186/BMXkjVEJ_400x400.jpg")
    let iv = UIImageView()
    iv.kf.setImage(with: url)
    if let png = iv.image?.jpegData(compressionQuality: .leastNormalMagnitude){
        filePath.putData(png, metadata: nil){ metadata, error in
            print("metadata: \(metadata) |error: \(error)") // doesn't print
        }
    }

知道为什么 iv.image?.jpegData() 是零吗?我也试过 iv.image?.pngData() 也是零。

作为

iv.kf.setImage(with: url)

是异步的 iv.image?.jpegData()/iv.image?.pngData() 在从服务器加载图像之前将为 nil

setImage 不会自动更改 image 属性。它可能必须从 Internet 下载图像,这需要时间。

幸运的是,您可以通过添加 completionHandler:

来知道下载何时完成
iv.kf.setImage(with: url, completionHandler: { result in
    guard case .success(let imageResource) = result else { 
        // an error has occurred!
        return 
    }
    if let png = imageResource.image.jpegData(compressionQuality: .leastNormalMagnitude){
        filePath.putData(png, metadata: nil){ metadata, error in
            print("metadata: \(metadata) |error: \(error)") // doesn't print
        }
    }
})

正如@Sh_Khan 所解释的,您需要等待 async 调用完成。这是修复:

let url = URL(string: "https://pbs.twimg.com/profile_images/1229497999392477186/BMXkjVEJ_400x400.jpg")
let iv = UIImageView()
iv.kf.setImage(with: url) { _ in
    if let png = iv.image?.jpegData(compressionQuality: .leastNormalMagnitude){
        filePath.putData(png, metadata: nil){ metadata, error in
            print("metadata: \(metadata) |error: \(error)")
        }
    }
}