使用 sub 类 时如何更新解析记录

How to update parse records when using sub classes

我有一个 parse.com 后端。我有一个 Message class,它是 PFObject 的子class。我将来自数据库的消息存储在数组 messages = Message.

当我需要更新记录时遇到了麻烦,因为我得到了重复项。

我一直在尝试做的是从消息数组中获取一条消息,然后调用 saveInBackgroundWithBlock...认为后端会知道它引用了数据库中的现有行。

我也刚遇到 fetchIfNeeded。

我的代码如下。我哪里错了?我应该如何更新存储在本地消息数组中的现有记录。如果有的话,我应该如何在我的场景中使用 fetchIfNeeded?或者我应该以某种方式使用核心数据/本地存储? (困惑)

class Message : PFObject, PFSubclassing {
 var messageTitle : NSString
 var imageFile: PFFile   
}

func getMessages() {}
 var currentMessages = [Message]()
 var messageQuery = Message.query()
 messageQuery.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
  for object in objects {
   var message = Message()
   message.messageTitle = object["messageTitle"] as String
   message.imageFile = object["imageFile"] as PFFile
   self.currentMessages.append(message)
  }
}

func updateMessage() {
 message.messageTitle = self.messageTitle.text
 let imageData = UIImagePNGRepresentation(self.imageToPost.image)
 let imageFile = PFFile(name: "image.png", data: imageData)
 message.imageFile = imageFile
 message.saveInBackgroundWithBlock({ (success: Bool!, error: NSError!) -> Void in
  if success == false {
   self.displayAlert("Something went wrong", error: "Please try again later")
  } else {
   self.navigationController?.popViewControllerAnimated(true)
  }
 })
}

func saveNewMessage() {
 message = Message()
 message.messageTitle = messageTitle.text
 let imageData = UIImagePNGRepresentation(self.imageToPost.image)
 let imageFile = PFFile(name: "image.png", data: imageData)
 message.imageFile = imageFile
 message.saveInBackgroundWithBlock({ (success: Bool!, error: NSError!) -> Void in
  if success == false {
   self.displayAlert("Something went wrong", error: "Please try again later")
  } else {
   self.navigationController?.popViewControllerAnimated(true)
  }
 })
}

您看到此错误的原因是您在完成块中创建了新的 Message 对象,而不是使用查询返回的对象。

func getMessages() {
    var currentMessages = [Message]()
    var messageQuery = Message.query()
    messageQuery.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
        for object in objects {
            // This is now creating a new, unsaved "Message" object
            var message = Message()
            message.messageTitle = object["messageTitle"] as String
            message.imageFile = object["imageFile"] as PFFile
            self.currentMessages.append(message)
            // This might be a much easier way to do what you want:
            self.currentMessages = objects
        }
    }
}