在这种情况下,我允许用户下载一个PFObject并在本地修改它,然后他们可以取消更改或点击完成,这将取消编辑界面,但尚未将更改上传到Parse。他们需要在上一个屏幕上点击Save,然后立即将所有更改写入数据库。
问题是,一旦修改了PFObject,您就无法在不从数据库中重新获取的情况下将其恢复到以前的状态。但是,每次访问Cancel时,我都不能从数据库中重新获取数据,因为以前的状态可能还没有上传到Parse (这是一个糟糕的UX,使它们等待丢弃仅存储在本地的更改)。
例如,假设用户点击编辑PFObject,他们进行更改,然后点击完成,然后再次点击它,然后进一步编辑对象,然后单击Cancel。在这种情况下,需要将对象恢复到其先前的状态,但该状态尚未上载到Parse。因此,我不能从数据库中重新获取数据以还原更改,否则它将覆盖它们第一次所做的更改。
为了解决这个问题,我只需获取PFObject并存储它的一个副本。我会说那是短暂的物体。我将拥有另一个存储真实对象的属性。用户将修改瞬态对象,当他们单击Cancel时,我只需将其设置为nil,如果他们按下Done,我将将真正的对象设置为与瞬态对象相等的真实对象,一旦他们最终点击Save,我将将真实的对象保存到数据库中。这样,我可以确保在用户提交更改之前不会对实际对象进行更改。问题是,PFObject不采用NSCopying协议(不确定原因),因此我无法创建PFObject的副本。我对它所做的任何改变都会影响到真实的对象。
如何解决这一问题,而不修改应用程序的设计,允许控制何时提交和保存数据?是否有一种方法来扩展PFObject并采用NSCopying,它以前做过吗?
我确实考虑过将对象的属性存储在字典中,并允许用户进行编辑,然后在提交时在PFObject上设置每个属性。这个解的问题产生于复杂的结构。在这个应用程序中,我允许用户修改包含多个PFObject的多个数组,只是不可能尝试用这样的复杂结构重新创建和合并更改,而不是单个简单的PFObject。
发布于 2015-05-22 21:02:46
我遇到了同样的问题。我没有直接对PFObject做任何更改,而是将更新保存在NSDictionary中。当用户单击done按钮时,我将更新PFObject和saveInBackground。我不认为PFObject有“放弃本地更改”选项。如果不这样做,唯一的选择是丢弃现有的PFObject并再次获取。
关于NSDictionary的评论,也许NSArray会更好。实现实际上取决于您的特定程序,但我将给出一个简单的示例。我们称之为NSArray的instructionArray。假设一个tableView中有三个部分。还假设每个部分的数据源是NSArray of PFObjects。现在假设您希望将第2节中的每个age属性设置为35。
将NSArray对象(对应于要执行的指令)添加到instructionArray。这一执行指示可以有以下形式
所以你要添加的对象是@[@(2),@"age",@(35)];
考虑到用户可能正在执行有限的指令,通过instructionArray在cellForRowAtIndexPath中循环可能没有那么大的性能,因此当单元格使用相应的PFObject来确定要显示什么时,它可以在指令之后循环遍历指令,并更改显示的内容,就好像PFObject被更新了一样。
当单击保存按钮时,循环执行指令,并实际编辑PFObjects本身。
如果您需要处理特定对象而不是部分的说明,那么只需更新instructionArray的结构即可。也许您可以包括一个标识符来指示它是什么类型的指令。
https://stackoverflow.com/questions/30405735
复制相似问题