解析文件查询和Swift 1.2错误 - getDataInBackgroundWithBlock

时间:2015-04-13 08:04:55

标签: ios xcode swift parse-platform

我正在尝试从Parse查询图像,我继续遇到fatal error: unexpectedly found nil while unwrapping optional value。我不确定这是否与最近对Swift和Xcode的更新有关,所以也许它在Parse端,或者肯定是用户错误。

getDataInBackGroundWithBlock将接受的唯一内容是NSData?NSError?作为选项。如果我尝试展开它们或使用其他类型,它将无法编译。

PFQuery按预期返回数据。只有在PFFile电话中尝试从NSData切换到getDataInBackGroundWithBlock时才会出现此问题。

该框架已连接并正在运行。我已经测试了很多。

这是调用堆栈:enter image description here

我现在已经连续工作了12个多小时。我到处都看了,尝试了很多不同的东西。我不认识任何与Swift或Xcode合作的人,你的帮助会走多里路。

以下是我试图无效的其他主题,一个是我自己的:

Unresolvable error with Parse "Get Data In Background With Block"

Parse and Swift 1.2 issue

Parse getDataInBackgroundWithBlock not fetching in order

Swift Image retrieving from Parse sdk - getting crashed

同样解析文档:

https://www.parse.com/docs/ios_guide#files/iOS(他们的例子是我今天的起点)

var photoArray: Array<UIImage> = []


override func viewDidLoad() {
    super.viewDidLoad()

    callPFObjectQuery()

    let testObject = PFObject(className: "QuestionMaster") //testobject
    testObject["foo"] = "bar" //testobject
    testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
        println("Object has been saved.")

    }
} 

func callPFObjectQuery() {

    var finalObjects: [PFObject] = []
    var nsdataObjects: NSData?

    var query: PFQuery = PFQuery(className: "QuestionMaster")
    query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in

        for object in objects! {

            let imageFiles = object["questionImage"] as! PFFile!

//error line     imageFiles.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in

                    if error == nil {

                        dispatch_async(dispatch_get_main_queue()) {

                            let image = UIImage(data: imageData!)
                            self.photoArray.append(image!)
                            println(self.photoArray[0])

                        }

                    }

                }
            }

        }
    }

更新,2015年11月12日 - Swift 1.2:自我发布此消息已经过去了几个月,因为它有超过1k的观看次数和没有upvotes的答案我认为最好回过头来确保我选择的确实是正确的。我还没有经过测试,但已经变得非常非常熟悉(6-8k行)和Parse SDK以及Swift我对我提供的答案感到满意。 Uttam Sinha非常接近,但是在getDataInBackgroundWithBlock中完成处理程序中的unwrapping而不是可选项将无效。它们必须是选项,然后在块中展开。 Ingouackaz完全错过了for循环,但他的getDataInBackgroundWithBlock电话是正确的。

我的第一次尝试充其量只是草率,我可能很沮丧。对于那些刚开始的人来说,数据查询之前的查询将以PFObject的数组完成。因此,您需要遍历该数组,在每个项目上调用getDataInBackgroundWithBlock

而不是object["questionImage"]我可能会选择object.valueForKey("questionImage")来使其更明确。我还将密钥字符串"questionImage"作为常量存储在密钥文件中,因此不必担心打字错误。

我不确定PDF文件和Parse。从那以后我没有尝试过。但现在我很好奇,因为如果可能的话,这将再次使我的工作更轻松。我会再次尝试更新。

4 个答案:

答案 0 :(得分:2)

这适用于Swift 1.2

file.getDataInBackgroundWithBlock({
                (imageData: NSData?, error: NSError?) -> Void in
                if (error == nil) {
                    let image = UIImage(data:imageData!)
                    println(image)
                }

            })

答案 1 :(得分:0)

试试这个。它有效 -

query.findObjectsInBackgroundWithBlock ({(objects:[AnyObject]!, error: NSError!) in
        if(error == nil){

            self.getImageData(objects as [PFObject])

        }
        else{
            println("Error in retrieving \(error)")
        }

    })//findObjectsInBackgroundWithblock - end


func getImageData(objects: [PFObject]) {
    for object in objects {

        let thumbNail = object["questionImage"] as PFFile

        println(thumbNail)

        thumbNail.getDataInBackgroundWithBlock({
            (imageData: NSData!, error: NSError!) -> Void in
            if (error == nil) {
                let image = UIImage(data:imageData)                
                println(image)
            }

        })//getDataInBackgroundWithBlock - end

    }//for - end
}

答案 2 :(得分:0)

删除&#34;!&#34;在下面一行的末尾:

 let imageFiles = object["questionImage"] as! PFFile!

应该是这样的:

 let imageFiles = object["questionImage"] as! PFFile

答案 3 :(得分:0)

这很有效。但是,此方法不适用于矢量图像。似乎故事板中的便利功能尚无法通过代码访问。至少不是这样的。

您可以注意到问题是imageFiles.getDataInBackgroundWithBlock行中的简单白色间距。不得不减去一个空格并添加括号。感谢@ user2770692指出这一点。

func queryImages() {

    var query: PFQuery = PFQuery(className: "QuestionMaster")
    query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in

        for object in objects! {

            let imageFiles = object["questionImage"] as! PFFile

            println(imageFiles)

            imageFiles.getDataInBackgroundWithBlock({
                (imageData: NSData?, error: NSError?) -> Void in
                if (error == nil) {
                    let image = UIImage(data:imageData!)
                    println(image)
                }

            })

        }

    }
}