Swift UIImageView Firebase DispatchQueue

Swift UIImageView Firebase DispatchQueue

我正在使用 firebase 来保存和加载我的图像。我在 Xcode 中创建了一个新视图,并使用我一直用来加载个人资料图像的相同代码。然而,这现在抛出一个错误,指出 url 字符串为 nil。图片url数据在“DispatchQueue.global().async”后消失。是什么原因造成的,我该如何追踪?非常奇怪这段代码如何适用于其他视图,但对于这个新视图却抛出错误。

let businessProfilePicture = dictionary["profPicString"] as! String
      if businessProfilePicture.count > 0 {
        let url = URL(string: businessProfilePicture)
        print(url)
        print("printing the url here to check")
        DispatchQueue.global().async {
          let dataURL = try? Data(contentsOf: url!)
          print(dataURL)
          print("printing the data url here")
          DispatchQueue.main.async {
            print(dataURL)
            print("Printing Data to check")
            let image = UIImage(data: dataURL!)?.potter_circleo
            self.businessProfilePicture.contentMode = UIView.ContentMode.scaleAspectFill
            self.businessProfilePicture.image = image
          }
        }

完整代码

func getWorkLocation() {
    let uid = Auth.auth().currentUser?.uid
    var profPicURL: String = ""
    
    Database.database().reference().child("employees").child(uid!).child("Business").observe(.value, with: { snapshot in
        if snapshot.exists() {
            let dictionary = snapshot.value as? NSDictionary
                self.businessName.text = dictionary?["businessName"] as? String
                self.businessStreet.text = dictionary?["businessStreet"] as? String
                self.businessCity.text = dictionary?["businessCity"] as? String
                profPicURL = dictionary?["profPicString"] as! String
                
                // set image
                if profPicURL.count > 0 {
                    let url = URL(string: profPicURL)
                    DispatchQueue.global().async {
                        let data = try? Data(contentsOf: url!)
                        DispatchQueue.main.async {
                            let image = UIImage(data: data!)?.potter_circle
                            self.businessProfilePicture.contentMode = UIView.ContentMode.scaleAspectFill
                            self.businessProfilePicture.image = image
                        }
                    }
                } else {
                    let image = UIImage(named: "profile picture")?.potter_circle
                    self.businessProfilePicture.contentMode = UIView.ContentMode.scaleAspectFill
                    self.businessProfilePicture.image = image
                }
                 
        } else {
            self.businessName.text = ""
            self.businessStreet.text = "Go to Add Work Location to send request"
            self.businessCity.text = ""
            self.deleteButton.isEnabled = false
        }
    })
}

您确定您从 profPicURL 创建的 URL 正在正确创建吗?

URL(string:) 可能会失败并且 return nil。如果您然后继续在 Data(contentsOf: url!) 中隐式解包它,您将崩溃。

同样,try? Data(contentsOf: url) 可以 return 为零。如果是这样,那么当你在 UIImage(data: data!) 中隐式解包时,你会崩溃。

正如 Jacob 在评论中所说,您需要了解更多有关隐式展开的可选值的信息。为了让你开始,你可以像这样构建你的代码:

if let url = URL(string: profPicURL) {
    DispatchQueue.global().async {
        if let data = try? Data(contentsOf: url),
           let image = UIImage(data: data)?.potter_circle
        {
            DispatchQueue.main.async {
                self.businessProfilePicture.contentMode = UIView.ContentMode.scaleAspectFill
                self.businessProfilePicture.image = image
            }
        } else {
            // raise an an error or set self.businessProfilePicture.image to a generic image or something
        }
    }
} else {
    // raise an an error or set self.businessProfilePicture.image to a generic image or something
}