【问题标题】:How to show image from url in ios swift [duplicate]如何在ios swift中显示来自url的图像[重复]
【发布时间】:2019-10-08 17:07:23
【问题描述】:

我正在尝试在我的 ios 应用程序 swift 中从 url 加载图像。我写了以下代码。

 let imageURL =  minHost + "\(userData["profileImage"])"
 let url = URL(string: imageURL)!
 let imageData = try? Data(contentsOf: url)
 profileImage.image = UIImage(data: imageData!)

现在 imageURL 有正确的 url,但 imageData 接收到 nil,因此,最后一行出现错误 Fatal error: Unexpectedly found nil while unwrapping an Optional value

【问题讨论】:

    标签: ios swift uiimage


    【解决方案1】:

    不使用Data(contentsOf:) 方法获取图像,而是使用URLSession 执行网络调用。

    let imageURL =  minHost + "\(userData["profileImage"])"
    
    if let url = URL(string: imageURL) {
        URLSession.shared.dataTask(with: url) {[weak self] (data, urlResponse, error) in
            if let data = data {
                DispatchQueue.main.async {
                    self?.profileImage.image = UIImage(data: imageData)
                }
            }
        }.resume()
    }
    

    重要提示:避免不必要地使用forced unwrapping (!)。它可能会导致不必要的应用程序崩溃。而是使用guardif-let 来解开optionals

    【讨论】:

      【解决方案2】:

      在游乐场试试这个。 从 URL 加载图像需要一些时间,并且需要在与主线程不同的另一个线程中执行。

      import UIKit
      
      let url = URL(string: "https://cdn.arstechnica.net/wp-content/uploads/2018/06/macOS-Mojave-Dynamic-Wallpaper-transition.jpg")!
      var image = UIImage()
      
      DispatchQueue.global().async {
          if let data = try? Data(contentsOf: url) {
              DispatchQueue.main.async {
                  image = UIImage(data: data)!
              }
          }
      }
      
      image
      

      【讨论】:

      • 悠悠球。有用!我已经测试过:))
      • 如果有帮助,请将答案标记为已回答!)
      • 强烈建议您不要使用同步的Data(contentsOf API 从远程 URL 加载数据,即使在后台线程上也是如此。
      【解决方案3】:

      你可以这样试试:

              let url = URL(string: "image url here")
              if url != nil {
                  DispatchQueue.global().async { [weak self] in
                      if let data = try? Data(contentsOf: url!) {
                          if let image = UIImage(data: data) {
                              DispatchQueue.main.async {
      
                                  self.profileImage.image = image
      
                              }
                          }
                      }
                  }
              }
      

      【讨论】:

        【解决方案4】:

        试试这个

        let url = URL(string:imageURL)
        if let data = try? Data(contentsOf: url!)
        {
            profileImage.image = UIImage(data: data, scale: 1.0)!
        }
        

        【讨论】:

          【解决方案5】:

          永远不要在主线程上执行下载任务。如果这样做,您将无法正确访问当前可见屏幕中的组件。它应该始终在后台线程上。

              if let url = URL(string: "https://....") {
          
                  DispatchQueue.global(qos: .background).async { 
          
                      if let data = try? Data(contentsOf: url) {
          
                          if let image = UIImage(data: data) {
          
                              DispatchQueue.main.async {
          
                                  self.profileImage.image = image
                              }
                          }
                      }
                  }
              }
          

          【讨论】:

          • 永远不要下载 Data(contentsOf:) 甚至不在后台线程上
          猜你喜欢
          • 1970-01-01
          • 2018-07-28
          • 2016-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-26
          • 2020-06-25
          • 1970-01-01
          相关资源
          最近更新 更多