Home > Net >  Swift UIImageView Firebase DispatchQueue
Swift UIImageView Firebase DispatchQueue

Time:10-22

I am using firebase to save and load my images. I have created a new view in Xcode and am using the same code I have been using to load profile images. Yet, this is now throwing an error saying that the url string is nil. The image url data disappears after "DispatchQueue.global().async". What could be causing this and how could I track this? Very strange how this code works for other views yet for this new view it is throwing an error.

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
          }
        }

enter image description here

enter image description here

Full Code

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
        }
    })
}

CodePudding user response:

Are you certain that the URL you create from profPicURL is being created properly?

URL(string:) can fail and return nil. If you then go on to implicitly unwrap it in Data(contentsOf: url!) you will crash.

Similarly, try? Data(contentsOf: url) can return nil. If it does, then when you implicitly unwrap it in UIImage(data: data!) you will crash.

As Jacob said in comments, you need to learn more about implicitly unwrapped optionals. To get you started, you might structure your code something like this:

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
}
  • Related