This question already has an answer here:
URL is always nil in Swift 3

(1个答案)


2年前关闭。




我有一个Firebase数据库,其中有我的图像URL。我试图根据“个人资料用户名”调用“个人资料图片”。我从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

最佳答案

if-let块与URL初始化程序一起使用。发生此错误的原因是url-init?(string: String)的可选实例。您的profileImageURL可能不是有效的url字符串,因此URL初始化程序无法创建类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")

  }
}

10-07 19:42
查看更多