Я пытаюсь загрузить изображение, которое загружено в хранилище моей базы данных, и ссылка на изображение находится в моей базе данных в реальном времени. Со ссылкой нет проблем, но когда я использую свой метод для возврата изображения из ссылки, я получаю ноль. Я заставляю его обернуть, потому что сейчас нужно вернуть изображение.
Это мой код:
func getImageFromUrl(url: URL) -> UIImage {
var tempImage: UIImage? = nil
print("INSIDE URL -> \(url.absoluteString)")
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print("Error on getImageFromUrl : \(error!.localizedDescription)")
return
}
print("Image data " + data.debugDescription)
DispatchQueue.main.async {
tempImage = UIImage(data: data!)!
print("TEMP IMAGE > \(String(describing: tempImage?.images![0]))")
}
}.resume()
if tempImage == nil {
print("IMAGE IS NIL!")
}
return tempImage!
}
Пожалуйста, дайте мне знать, почему мой код не работает.
метод загрузки асинхронный. Вы возвращаете результат до завершения процесса загрузки. Вам нужно добавить в свой метод обработчик завершения.





Проблема с вашим кодом заключается в том, что метод dataTask является асинхронным. Вы возвращаете результат до завершения процесса загрузки. Что вам нужно, так это добавить обработчик завершения в свой метод, чтобы вернуть изображение или ошибку после завершения:
import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
func getImage(from url: URL, completion: @escaping (UIImage?, Error?) -> ()) {
print("download started:", url.absoluteString)
URLSession.shared.dataTask(with: url) { data, reponse, error in
guard let data = data else {
completion(nil, error)
return
}
print("download finished:")
completion(UIImage(data: data), nil)
}.resume()
}
let url = URL(string: "https://i.stack.imgur.com/varL9.jpg")!
getImage(from: url) { image, error in
guard let image = image else {
print("error:", error ?? "")
return
}
print("image size:", image.size)
// use your image here and don't forget to always update the UI from the main thread
DispatchQueue.main.async {
self.imageView.image = image
}
}
Я использовал следующий код, но получаю эту ошибку: запрошенный URL-адрес не найден на этом сервере. Я вижу, что URL-адрес находится в моей базе данных Firebase. Что бы это могло быть?
Покажи свой URL. Вы тестировали его в своем браузере на рабочем столе? Что просходит?
Если я скопирую и вставлю свой URL-адрес в браузер, он автоматически загрузит jpg. Это URL -> firebasestorage.googleapis.com/v0/b/the-spot-6bdd6.appspot.c om /…
Просто вставил вашу ссылку в мою игровую площадку и распечатал "image size: (3072.0, 2304.0)\n"
Попробуйте использовать расширение UIImageView, которое я разместил здесь stackoverflow.com/a/27712427/2303865
Хм хорошо, спасибо, я попробую.
Я получаю эту ошибку {"error": {"code": 403, "message": "Permission denied. Не удалось выполнить эту операцию"}}
Убедитесь, что вы используете правильный токен
Срок действия вашей ссылки истек. попробуйте щелкнуть ссылку, которую вы разместили выше { "error": { "code": 403, "message": "Permission denied. Could not perform this operation" } }
Он возвращает строку json вместо изображения
Как он истекает, если я загружаю и скачиваю после загрузки.