在Unwrapping时,URL意外地找到了nil

时间:2017-12-20 16:48:03

标签: ios swift url

我有一个Firebase数据库,其中包含我的图片网址。我试图根据配置文件用户名调用配置文件图像。我从profileImageURL获取正确的URL,但每当我启动URLSession时,它总是显示为nil。这是我的代码:

 if let profileImageURL = user.profileImageURL{

      let url = URL(string: profileImageURL)
      URLSession.shared.dataTask(with: url!, completionHandler: { ( data, response, error) in
           //Download Hit an Error
           if error != nil {
                print(error!)
                return
           }
           DispatchQueue.main.async() {
                     cell.profileNameImageView?.image = UIImage(data: data!)
                }
      })
 }

示例网址字符串:

https://firebasestorage.googleapis.com/v0/b/instagram-caption-generator.appspot.com/o/FeaturedAccounts%2FProfileImage%2Ffeatured_2.jpg?alt=media&token=4a2774f5-f192-4f06-b7c1-a4044921c075

2 个答案:

答案 0 :(得分:3)

if-let阻止与网址初始化一起使用。此错误的原因是url的可选实例 - init?(string: String)。您profileImageURL可能不是有效的网址字符串,因此网址初始化程序无法生成类URL的实例并返回nil,您尝试使用!解包。

试试这个并看看。

if let profileImageURL = user.profileImageURL{

   // Use if-let block with URL initialiser.
  if let url = URL(string: profileImageURL) { // try this - if let url = URL(string: "gs://instagram-caption-generator.appspot.com/FeaturedAccoun‌​ts/ProfileImage/feat‌​ured_2.jpg") {

     // Remove unwrapper !, from url           
     URLSession.shared.dataTask(with: url, completionHandler: { ( data, response, error) in
       //Download Hit an Error
         if error != nil {
             print(error!)
              return
         }

          if let imageData = data {
            DispatchQueue.main.async() {
              cell.profileNameImageView?.image = UIImage(data: imageData)
            }
          } else {
            print("image data is nil")
          }
       }).resume()
  } else {
    print("url is nil")

  }
}

答案 1 :(得分:1)

您可以使用guardif let语句并展开profileImageURL 在一次扫描中验证它实际上是有效的网址,如下所示:

guard let profileImageURL = user.profileImageURL,
      let url = URL(string: profileImageURL) else { return }

// now you know that url is definitely a valid URL
URLSession.shared.dataTask(with: url, completionHandler: { ( data, response, error) in
    //Download Hit an Error
     if error != nil {
         print(error!)
         return
     }

     DispatchQueue.main.async() {
         cell.profileNameImageView?.image = UIImage(data: data!)
     }
})

为您节省解缠导致问题的力量!(正如您刚刚发现的那样)。

希望有所帮助。