【问题标题】:Unable to update imagefile column in Parse using Swift无法使用 Swift 更新 Parse 中的图像文件列
【发布时间】:2016-07-30 16:53:37
【问题描述】:

我在表格视图中选择一个单元格,将值传递给视图控制器,然后允许用户使用下面的代码更新 Parse 上的行(在 Heroku 上运行)。

我面临的问题是 - “标题”列已更新,但图像文件列未更新为选择的新图像。我可以看到新图像确实传递到了代码中。

我正在使用同步调用,因为除非保存记录,否则不希望用户继续前进。

有什么问题吗?保存新对象的相同代码工作正常。

谢谢 灰烬

                let query = PFQuery(className:"class")
                query.whereKey("objectId", containsString: passedObject.objectId)

                do {

                    let results = try query.findObjects() 

                    if results.count == 0 {

                         print("error")

                        success = false

                     } else {
                        //update


                        do {

                            let obj = results.first

                            obj!["title"] = Title.text!

                            let imageData = UIImageJPEGRepresentation(imageOutlet.image!,0.2)
                            let imageFile = PFFile(name: "image.png", data: imageData!)


                            //try imageFile?.save() // is this needed?
                            obj!["imagefile"] = imageFile

                            try obj!.save()
                            self.success = true 


                        }  catch let er as NSError {

                            print(" error while updating - \(er)")
                        }

                     }
                } catch {

                    print("error while querying  \(error)")

                    success = false
                }

【问题讨论】:

  • 能否请您对文件执行 save() 函数,看看是否有结果?我还注意到你正在对服务器执行同步调用,这会卡住你的主线程,你可以通过调用 saveInBackground 在后台线程上执行它而不是保存
  • 我确实在文件上运行了 save() ,但这也没有用。我在使用 unwind segue 时故意进行同步调用,所以如果我使用 saveInBackground,那么线程将在保存完成之前返回,这是我不想要的。
  • 您能否粘贴您的 imageOutlet 定义的代码?
  • @IBOutlet 弱 var imageOutlet: UIImageView!
  • 您好,请您执行以下操作: let imageData = UIImageJPEGRepresentation(imageOutlet.image,0.2) let imageFile = PFFile(name: "image.png", data: imageData) 只需删除 !在这两行中

标签: swift parse-platform ios9 xcode7.3


【解决方案1】:

我自己进行了一些测试,这段代码对我有用:

Aync 版本

    let query = PFQuery(className: "FileTest")
    query.findObjectsInBackgroundWithBlock {
        (objects: [PFObject]?, error: NSError?) -> Void in

        let imageData = UIImageJPEGRepresentation(self.imageOutlet.image!, 0.2)
        let fileToSave = PFFile(name: "myfile.png", data: imageData!)

        let firstObj = objects?.first
        firstObj!["fileToSave"] = fileToSave
        firstObj!.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
            print("Object has been saved.")
        }


    }

同步版本

    let query = PFQuery(className: "FileTest")

    do {
        let objects = try query.findObjects()
        let firstObj = objects.first

        let imageData = UIImageJPEGRepresentation(self.imageOutlet.image!, 0.2)
        let fileToSave = PFFile(name: "myfile.png", data: imageData!)
        firstObj!["fileToSave2"] = fileToSave
        try firstObj!.save()
        print("object saved")


    } catch let er as NSError {
        print("error")
    }

【讨论】:

  • 您正在创建新对象。尝试为此对象 ID 保存一个新文件。
  • 为现有对象保存一个新文件?
  • 我更新了我的答案。我首先获取所有对象,然后更新结果中第一个对象的文件并保存。它按预期对我有用..
  • 是的。当我尝试用不同的图像保存对象时,我的代码失败了。我用 contenttype 参数尝试了你的代码,但仍然是同样的问题。未保存新图像。我可以看到 PFFile() 方法调用生成的新 URL,但不知何故 obj!.save() 忽略了它。这可能是一个错误吗?
  • 嗨,冉,正如我在评论中提到的,我不想使用后台保存,因为我希望用户等到成功,如果我使用后台保存,那么我的 segue 会运行调用 VC 并且可能给用户错误的状态。这就是为什么我使用同步调用 query.findObjects()
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多