从Parse sdk检索的Swift图像 - 崩溃

Sur*_*raj 0 ios parse-platform swift

我正在从Parse中检索一组图像,使用以下代码使用Swift.

var imageResources : Array<UIImage> = []
override func viewDidLoad(){
    super.viewDidLoad()
    self.loadImages()
}

func loadImages(){

    var query = PFQuery(className: "Images")
    query.orderByDescending("objectId")

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

            for object : PFObject! in objects as [PFObject] {                

                var thumbNail = PFFile()
                thumbNail = object["image"] as PFFile
                println("thumNail \(thumbNail)")
                thumbNail.getDataInBackgroundWithBlock({
                   (imageData: NSData!, error: NSError!) in
                   if (error == nil) {
                        let image : UIImage = UIImage(data:imageData)
                        //image object implementation
                        self.imageResources.append(image)
                    }

                })//getDataInBackgroundWithBlock - end

            }//for - end

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

    })//findObjectsInBackgroundWithblock - end


}
Run Code Online (Sandbox Code Playgroud)

我的Parse Class细节

班级名称 - 图像 解析类模式

当我运行这个函数时,它在控制台中没有消息就崩溃了.

注意:我能够在回调中获得PFFile对象的集合.

我用"var imageData = thumbNail.getData()var image = UIImage(data:imageData)"替换了"thumbNail.getDataInBackgroundWithBlock({...."块与同步函数调用thumbNail.getData()

然后错误说

警告:正在主线程上执行长时间运行的操作.打破warnBlockingOperationOnMainThread()进行调试.

所以,我恢复了thumbNail.getDataInBackGroundWithBloack({...但是现在,控制台中没有错误显示,因为它发生在我之前.我的方法有什么问题请告诉我.任何帮助将不胜感激... !

Tom*_*wer 7

我设法重新创建了错误,这似乎是PFObject上的某种内存泄漏/僵尸.我不确定为什么,但是以下面的方式重构你的代码摆脱了我的错误:

func loadImages() {

    var query = PFQuery(className: "Images")
    query.orderByDescending("objectId")


    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["image"] as PFFile

        println(thumbNail)

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

        })//getDataInBackgroundWithBlock - end

    }//for - end
}
Run Code Online (Sandbox Code Playgroud)

编辑:顺便说一句,这也有效:

func loadImages() {

    var query = PFQuery(className: "Images")
    query.orderByDescending("objectId")


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

            let imageObjects = objects as [PFObject]

            for object in objects {

                let thumbNail = object["image"] as PFFile

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

                })//getDataInBackgroundWithBlock - end

            }//for - end

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

    })//findObjectsInBackgroundWithblock - end


}
Run Code Online (Sandbox Code Playgroud)

这表明错误是由以下行引起的:

for object : PFObject! in objects as [PFObject] {
Run Code Online (Sandbox Code Playgroud)

重写该行如下:

for object : PFObject in objects as [PFObject] {
Run Code Online (Sandbox Code Playgroud)

同时删除错误.所以这个错误的原因似乎是你告诉程序解开一些不可选的东西.