【问题标题】:Swift Image retrieving from Parse sdk - getting crashed从 Parse sdk 检索的 Swift 图像 - 崩溃
【发布时间】:2014-09-10 11:47:34
【问题描述】:

我正在从 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


}

我的 Parse 类详细信息

类名 - 图片

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

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

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

然后错误说

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

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

【问题讨论】:

  • 当我尝试将 PFFile 转换为 UIImage 时,即 (thumbNail.getDataInBackground({.... ) 这就是问题所在,对此的任何帮助都会非常棒。
  • 如果您发布整个堆栈跟踪信息会更容易提供帮助。
  • @TomErikStøwer :在我的控制台中没有堆栈跟踪。它只是突然退出执行。
  • 你要获取多少 pfobjects?
  • 我正在获取 20 个 PFObjects 作为具有 20 行的 Parse 类“图像”。

标签: ios swift parse-platform


【解决方案1】:

我设法重新创建了错误,这似乎是 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
}

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

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


}

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

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

重写该行如下:

for object : PFObject in objects as [PFObject] {

也消除了错误。所以这个错误的原因似乎是你告诉程序打开一些不是可选的东西。

【讨论】:

  • 是的,用可选变量替换普通变量确实很神奇。非常感谢 TomErikStower !!!,您回答了困扰我超过 2 天的问题。再次感谢:-)
  • 我不知道为什么人们不赞成这个问题。我花了几个小时调试同样的问题,但找不到解决方案。非常感谢你。您能否提供更多信息,说明为什么解开它不是可选的东西会导致这样的错误。
  • 不确定我是否理解您的问题@zirinisp。可选项与它所包装的东西的类型不同。因此,试图解开一些不是可选的东西,只是没有任何意义。这就像在没有实现该方法的类型上调用 aMethod()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多