0

我处于允许用户下载PFObject并在本地修改它的情况,然后他们可以取消更改或点击完成,这将关闭编辑界面但尚未将更改上传到 Parse。他们需要在上一个屏幕上点击 Save 以一次将所有更改写入数据库。

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

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

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

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

我确实考虑将对象的属性存储在字典中,并允许用户编辑它,然后在提交时将这些属性中的每一个设置在PFObject. 这种解决方案的问题在于复杂的结构。在这个应用程序中,我允许用户修改包含多个PFObjects 的多个数组。除了一个简单的PFObject.

4

1 回答 1

0

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

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

NSArray对象(对应于要执行的指令)添加到instructionArray. 该执行指令可以具有以下形式

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

所以你要添加的对象是@[@(2),@"age",@(35)];

鉴于用户可能正在执行有限数量的指令,循环遍历instructionArrayin可能不会有那么大的性能,cellForRowAtIndexPath因此当单元格使用其对应PFObject的来确定要显示的内容时,它可以在之后循环执行指令并更改内容显示为好像PFObject已更新。

触摸保存按钮时,循环浏览说明并实际编辑PFObjects它们自己。

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

于 2015-05-22T21:02:46.650 回答