我正在尝试从UIImageView
中提取图像数据,以便将其上传到Firebase存储。 但是,iv.image?。jpegdata()
返回nil。 我使用标准的Kingfisher库方法将图片从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()
,结果也是零。
SetImage
不会自动更改Image
属性。 它可能需要从互联网下载图像,这需要时间。
幸运的是,您可以通过添加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
}
}
})
作为
iv.kf.setImage(with: url)
异步iv.image?。jpegdata()/iv.image?。pngdata()
将为零,直到从服务器加载图像
正如@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)")
}
}
}