创建 PFObject 的副本

Creating a copy of a PFObject

我的情况是允许用户下载 PFObject 并在本地修改,然后他们可以取消更改或点击完成,这将关闭编辑界面但不会上传更改为 Parse 呢。他们需要点击上一个屏幕上的“保存”以立即将所有更改写入数据库。

问题是一旦 PFObject 被修改,如果不从数据库中重新获取就无法将其恢复到之前的状态。但是每次他们点击取消时,我不能总是从数据库中重新获取数据,因为之前的状态可能还没有上传到 Parse(这是一个糟糕的用户体验,让他们等待丢弃只存储在本地的更改)。

例如,假设用户点击编辑 PFObject,他们进行更改然后点击完成,然后再次点击它并进一步编辑对象,然后点击取消。在这种情况下,对象需要恢复到其先前的状态,但该状态尚未上传到 Parse。所以我不能从数据库中重新获取数据来恢复更改,否则它会覆盖他们第一次所做的更改。

要解决这个问题,我会简单地获取 PFObject 并存储它的副本。我称之为瞬态对象。我会有另一个 属性 来存储真实的对象。用户会修改瞬态对象,当他们点击取消时,我会简单地将其设置为 nil,如果他们点击完成,我会将真实对象设置为与瞬态对象相等,一旦他们最终点击保存,我会将真实对象保存到数据库中。这样我就可以确定在用户提交更改之前不会对真实对象进行更改。问题是,PFObject 不采用 NSCopying 协议(不知道为什么),因此我无法创建 PFObject 的副本。我对它所做的任何更改都会影响真实对象。

如何在不修改允许控制何时提交和稍后保存数据的应用程序设计的情况下解决这个问题?有没有办法扩展PFObject并采用NSCopying,以前做过吗?

我确实考虑过将对象的属性存储在字典中并允许用户对其进行编辑,然后在提交时在 PFObject 上设置每个属性。该解决方案的问题出现在复杂的结构中。在此应用程序中,我允许用户修改包含多个 PFObject 的多个数组。除了单个简单的 PFObject.

之外,尝试重新创建并在以后将更改与像这样的复杂结构合并是不可行的

我运行遇到了同样的问题。我没有直接对 PFObject 进行任何更改,而是将更新保存在 NSDictionary 中。当用户单击完成按钮时,我会更新 PFObject 和 saveInBackground。我认为 PFObject 没有 "discard local changes" 选项。如果您不这样做,唯一的选择是丢弃现有的 PFObject 并重新获取。

关于NSDictionary的评论,也许NSArray会更好。实施实际上取决于您的具体程序,但我将举一个简单的例子。 NSArray 我们称之为 instructionArray。想象一下 tableView 中有 3 个部分。还假设每个部分的数据源是 PFObjectsNSArray。现在假设您要将第 2 节中每个 PFObject 的 age 属性 设置为 35。

instructionArray添加一个NSArray对象(对应执行的指令)。该执行指令可以采用

的形式
  1. 要更新的部分
  2. 属性 更新
  3. 要更新到的值

因此您要添加的对象是 @[@(2),@"age",@(35)];

鉴于用户可能执行的指令数量有限,因此在 cellForRowAtIndexPath 中循环遍历 instructionArray 可能不会带来太大的性能负担,因此当一个单元格使用其对应的 PFObject 来弄清楚要显示什么,它可以循环遍历之后的指令并更改显示的内容,就好像 PFObject 已更新一样。

触摸保存按钮时,遍历指令并实际编辑 PFObjects 本身。

如果您需要指令来处理特定对象而不是部分,那么您只需更新 instructionArray 的结构。也许您可以包含一个标识符来指示它是什么类型的指令。