我处于允许用户下载PFObject
并在本地修改它的情况下,然后他们可以取消更改或点击完成,这将取消编辑界面但不上传更改到解析了。他们需要在上一个屏幕上点击“保存”,立即将所有更改写入数据库。
问题是修改PFObject
后,如果不从数据库中重新获取,则无法将其恢复到先前的状态。但是每次点击取消时我都不能总是从数据库中重新获取数据,因为先前的状态可能还没有上传到Parse(并且这是一个糟糕的用户体验,使他们等待放弃仅存储在本地的更改)。
例如,假设用户点击编辑PFObject
,他们进行更改然后点击完成,然后再次点击它并进一步编辑对象,然后点击取消。在这种情况下,对象需要恢复到其先前状态,但该状态尚未上传到Parse。所以我无法从数据库中重新获取数据以还原更改,否则会覆盖他们第一次所做的更改。
要解决此问题,我只需获取PFObject
并存储它的副本。我称之为瞬态对象。我会有另一个存储真实对象的属性。用户会修改瞬态对象,当他们点击取消时,我只需将其设置为nil
,如果他们改为完成,我会将真实对象设置为等于瞬态对象,一旦他们最终命中保存,我会将真实对象保存到数据库中。这样我可以确保在用户提交更改之前不会对真实对象进行更改。问题是,PFObject
没有采用NSCopying
协议(不确定原因),因此我无法创建PFObject
的副本。我对它做出的任何改变都会影响真实对象。
如何在不修改应用程序设计的情况下解决这个问题,该设计允许控制何时提交数据并稍后保存?有没有办法扩展PFObject
并采用NSCopying
,是否已经完成过?
我确实考虑过将对象的属性存储在字典中,并允许用户编辑它,然后在提交时设置PFObject
上的每个属性。这种解决方案的问题出现在复杂的结构中。在这个应用程序中,我允许用户修改包含多个PFObject
的多个数组。尝试重新创建并稍后将更改与这样的复杂结构合并在一个简单的PFObject
之外是不可行的。
答案 0 :(得分:0)
我遇到了同样的问题。我没有直接对PFObject进行任何更改,而是将更新保存在NSDictionary中。当用户单击完成按钮时,我会更新PFObject和saveInBackground
。我不认为有一个"丢弃当地的变化" PFObject的选项。如果你不这样做,唯一的选择是抛弃现有的PFObject并再次获取。
关于NSDictionary
评论,或许NSArray
会更好。实现真的取决于您的具体计划,但我会举一个简单的例子。 NSArray
我们会致电instructionArray
。想象一下tableView中有3个部分。还假设每个部分的数据源是NSArray
PFObjects
。现在假设你要在第2节到第35节中设置每个PFObject的age
属性。
将NSArray
对象(对应于要执行的指令)添加到instructionArray
。执行此指令可以采用
因此,您添加的对象为@[@(2),@"age",@(35)];
鉴于用户可能正在执行有限数量的指令,因此在instructionArray
中循环cellForRowAtIndexPath
可能不会导致性能过重,因此当一个单元格使用其对应的PFObject
时要找出要显示的内容,它可以循环显示指令并更改显示的内容,就好像PFObject
已更新一样。
触摸保存按钮时,循环显示说明并实际编辑PFObjects
自己。
如果您需要处理特定对象而非部分的说明,则只需更新instructionArray
的结构即可。也许你可以包含一个标识符来指示它是什么类型的指令。