创建PFObject的副本

时间:2015-05-22 20:55:45

标签: ios parse-platform pfobject nscopying

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

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

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

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

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

我确实考虑过将对象的属性存储在字典中,并允许用户编辑它,然后在提交时设置PFObject上的每个属性。这种解决方案的问题出现在复杂的结构中。在这个应用程序中,我允许用户修改包含多个PFObject的多个数组。尝试重新创建并稍后将更改与这样的复杂结构合并在一个简单的PFObject之外是不可行的。

1 个答案:

答案 0 :(得分:0)

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

关于NSDictionary评论,或许NSArray会更好。实现真的取决于您的具体计划,但我会举一个简单的例子。 NSArray我们会致电instructionArray。想象一下tableView中有3个部分。还假设每个部分的数据源是NSArray PFObjects。现在假设你要在第2节到第35节中设置每个PFObject的age属性。

NSArray对象(对应于要执行的指令)添加到instructionArray。执行此指令可以采用

形式
  1. 要更新的部分
  2. 要更新的媒体资源
  3. 要更新为
  4. 的值

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

    鉴于用户可能正在执行有限数量的指令,因此在instructionArray中循环cellForRowAtIndexPath可能不会导致性能过重,因此当一个单元格使用其对应的PFObject时要找出要显示的内容,它可以循环显示指令并更改显示的内容,就好像PFObject已更新一样。

    触摸保存按钮时,循环显示说明并实际编辑PFObjects自己。

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