Swift 为什么从url下载图像返回零?

Swift 为什么从url下载图像返回零?,swift,firebase,uiimage,Swift,Firebase,Uiimage,我正在尝试下载一个上传到数据库存储的图像,该图像的链接位于我的实时数据库中。链接没有问题,但是当我使用我的方法从链接返回图像时,我得到的是零。我强制包装它,因为它现在需要返回一个图像 这是我的代码: func getImageFromUrl(url: URL) -> UIImage { var tempImage: UIImage? = nil print("INSIDE URL -> \(url.absoluteString)") URLSession.

我正在尝试下载一个上传到数据库存储的图像,该图像的链接位于我的实时数据库中。链接没有问题,但是当我使用我的方法从链接返回图像时,我得到的是零。我强制包装它,因为它现在需要返回一个图像

这是我的代码:

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方法是异步的。您将在下载过程完成之前返回结果。您需要向方法中添加一个完成处理程序,以便在完成后返回图像或错误:




下载方法是异步的。您将在下载过程完成之前返回结果。您需要的是向您的方法添加一个完成处理程序。我使用了以下代码,但出现了以下错误:在此服务器上找不到请求的URL。我可以看到URL在我的Firebase数据库中。这可能是什么?显示你的url。您在桌面浏览器中测试过吗?会发生什么?如果我在浏览器中复制并粘贴我的url,它会自动下载jpg。这是url->刚刚在我的游乐场粘贴了你的链接,它打印了
“图像大小:(3072.02304.0)\n”
尝试使用我在这里发布的UIImageView扩展名
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
    }
}