jpegData () из UIImageView равен нулю - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь извлечь данные изображения из UIImageView, чтобы загрузить их в хранилище Firebase. Однако iv.image?.jpegData() возвращает ноль. Я использую стандартный метод 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(), и это тоже ноль.

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

Поскольку

iv.kf.setImage(with: url)

является асинхронным iv.image?.jpegData()/iv.image?.pngData() будет равно нулю, пока изображение не будет загружено с сервера

1 голос
/ 17 июня 2020

Как объяснил @Sh_Khan, вам нужно дождаться вызова async на fini sh. Вот исправление:

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)")
        }
    }
}
1 голос
/ 17 июня 2020

setImage не изменяет свойство image автоматически. Он должен потенциально загрузить изображение из Inte rnet, что требует времени.

К счастью, вы можете узнать, когда загрузка будет завершена, добавив 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
        }
    }
})
...