从Parse加载图像文件时出错

时间:2015-06-29 22:33:22

标签: ios swift parse-platform

有问题的行是“让productImageFile = productData![”productImage“]为!PFFile”这给了我错误“致命错误:在展开Optional值时意外发现nil (lldb)“。我发现的唯一答案涉及确保我不打算解开显式定义的选项(我认为这是术语),但我搞乱了选项,我解除了什么,什么时候,但是我没有运气。没有其他消息来源能够为我解决这个具体问题而且我被困住了。请帮忙。

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



        }

    }

2 个答案:

答案 0 :(得分:0)

我假设您没有拥有图片的所有产品,因此您需要按以下步骤更新您的代码:

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

这将保证只有在productImage的响应为PFFile时才会处理productImageFile。

答案 1 :(得分:0)

如果您的错误没有打印任何有用的内容,请确保您获得有效数据。检查数据长度,看它是否与文件大小相符。

另外,检查imageView是否在主线程上设置图像,如果从后台线程调用则不会显示。

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