Ios 创建PFObject的副本

Ios 创建PFObject的副本,ios,parse-platform,pfobject,nscopying,Ios,Parse Platform,Pfobject,Nscopying,我的情况是,我允许用户下载PFObject并在本地对其进行修改,然后他们可以取消更改或点击“完成”,这将关闭编辑界面,但不会将更改上载到解析。他们需要在上一个屏幕上点击Save,以立即将所有更改写入数据库 问题是,一旦修改PFObject,如果不从数据库重新蚀刻,就无法将其恢复到先前的状态。但是我不能每次点击Cancel时都从数据库中重新提取数据,因为之前的状态可能还没有上传到Parse,这是一个糟糕的UX,让他们等待放弃只存储在本地的更改 例如,假设用户点击编辑PFObject,他们进行更改,

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

问题是,一旦修改PFObject,如果不从数据库重新蚀刻,就无法将其恢复到先前的状态。但是我不能每次点击Cancel时都从数据库中重新提取数据,因为之前的状态可能还没有上传到Parse,这是一个糟糕的UX,让他们等待放弃只存储在本地的更改

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

为了解决这个问题,我只需获取PFObject并存储它的副本。我把它叫做瞬变物体。我会有另一个存储真实对象的属性。用户会修改瞬态对象,当他们点击Cancel时,我会简单地将其设置为nil,如果他们点击Done,我会将真实对象设置为瞬态对象,一旦他们最终点击Save,我会将真实对象保存到数据库中。这样,我可以确保在用户提交更改之前不会对真实对象进行更改。问题是,PFObject没有采用NSCopying协议,不知道为什么,因此我无法创建PFObject的副本。我对它所做的任何更改都会影响真实对象

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


我考虑将对象的属性存储在字典中,并允许用户编辑该属性,然后在提交时将这些属性设置在PFObjt上。这种解决方案的问题在于复杂的结构。在这个应用程序中,我允许用户修改包含多个对象的多个数组。除了一个简单的PFObject之外,尝试重新创建并在以后合并具有复杂结构的更改是不可行的。

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

关于NSDictionary的评论,也许NSArray会更好。实现实际上取决于您的特定程序,但我将给出一个快速示例。NSArray我们称之为instructionArray。假设在tableView中有3个部分。还假设每个部分的数据源是PFObjects的NSArray。现在假设您想将第2节中每个PFObject的age属性设置为35

将与要执行的指令相对应的NSArray对象添加到instructionArray。执行此指令的形式可以是

要更新的部分 要更新的属性 要更新到的值 那么你要添加的对象是@[@2,@age,@35]

考虑到用户可能执行的指令数量有限,在cellForRowAtIndexPath中循环使用指令数组可能不会带来太大的性能负担,因此当一个单元格使用其相应的PFObject来确定要显示什么时,之后,它可以循环浏览指令,并更改显示内容,就好像PFObject已更新一样

当按下保存按钮时,循环浏览说明并实际编辑对象本身


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

我使用的方法是存储局部变量中的更改,并在按save时更新实际的PFObject值。我刚刚在问题末尾添加了一段,说明为什么字典方法不适用于此应用程序,并且重新蚀刻将放弃以前编辑会话中的所有更改,这些更改在此设置中也不起作用。如果您真的因为我推行NSDictionary方法而对我大发雷霆,是否可以在dictionary中记录操作而不是对象本身。保存“完成”按钮后,对批次执行这些操作。在UI方面,显示对象,但使用操作进行更新
我不确定你所说的动作是什么意思,也许你可以用一个例子来更新答案。在这种情况下,用户可以在任何索引处向数组添加PFObjects,在数组中的任何索引处修改对象的属性,或者删除数组中的任何现有对象。