简体   繁体   中英

Getting error when loading image file from Parse

The line in question is "let productImageFile = productData!["productImage"] as! PFFile" which gives me the error "fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)". The only answers I've found have involved making sure I am not trying to unwrap explicitly defined optionals (I think that's the term), but I messed around with the optionals, and which I unbind and when, but I'm having no luck. No other source has been able to solve this specific issue for me and I'm stuck. Please help.

    override func viewDidLoad() {
    super.viewDidLoad()

    //Create new PFQuery to retrieve info from Parse
    var query: PFQuery = PFQuery(className: "MyProduct")

    //function to get the data
    func getProductData (){
        //call function to get the data from parse by specifyng an objectId
        query.getObjectInBackgroundWithId("XXXXXXXXXX") {
            (productData:PFObject?, error:NSError?) -> Void in
            if error == nil && productData != nil {
                //Extract values from the productData PFObject and store them in constants
                let dayOfTheWeek = productData!.objectForKey("day") as! String
                let productTitle = productData!.objectForKey("productTitle") as! String
                //-----start image loading
                let productImageFile = productData!["productImage"] as! PFFile
                productImageFile.getDataInBackgroundWithBlock {
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil {
                        if let imageData = imageData {
                            let image = UIImage(data:imageData)
                            self.productImageView.image = image!
                        } else {println("Could not load image.")}
                    }
                }

                //-----end image loading
                let productPrice = productData!.objectForKey("productPrice") as! String
                let productDescription = productData!.objectForKey("productDescription") as! String

                //take the saved constants and assign their values to the labels and UIImage on screen
                self.productTitleLabel.text = productTitle
                self.dayOfTheWeekLabel.text = dayOfTheWeek
                self.productPriceLabel.text = productPrice
                self.productDescriptionLabel.text = productDescription



            } else if error != nil {
                println("Could not load data from Parse")
            }



        }

    }

I assume not for all products you have an image, so you need to update your code as following:

if let productImageFile = productData!["productImage"] as? PFFile {
                productImageFile.getDataInBackgroundWithBlock {
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil {
                        if let imageData = imageData {
                            let image = UIImage(data:imageData)
                            self.productImageView.image = image!
                        } else {println("Could not load image.")}
                    }
                }
}

This will guarantee that productImageFile will be processed only if response of productImage is PFFile.

Ensure you are getting valid data if your error is not printing anything useful. Check the data length and see if it corresponds to the file size.

Also, check to see if the imageView is setting the image on the main thread, it will not show if called from a background thread.

dispatch_async(dispatch_get_main_queue(), ^ {
   self.productImageView.image = image!
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM