提问者:小点点

UIIimageView中的jpegData()为零


我正在尝试从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(),结果也是零。


共3个答案

匿名用户

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