Swift/Cloudkit:在拉取时处理用户更改

Swift/Cloudkit:在拉取时处理用户更改,swift,cloudkit,Swift,Cloudkit,我从和了解到,与Cloudkit同步的普遍方式是先推送本地更改,然后拉送远程更改,这样我就可以在推送过程中检测到由于服务器上的更新版本而导致的更改 但是如果我再拉一点呢 用户进行了更改,用户更改使数据无效 用户所做的更改是否因文件已被删除而过时 一个例子是,在用户对所述文件夹中的文件进行编辑后,在要上载的堆栈上的更改上,pull删除文件夹。因此,当用户在更改列表上按下操作时,拉操作当前起作用,因为更改已经在本地完成 我想到的处理这个问题的一种方法是,在我从服务器拉取数据时,不允许任何用户更改

我从和了解到,与Cloudkit同步的普遍方式是先推送本地更改,然后拉送远程更改,这样我就可以在推送过程中检测到由于服务器上的更新版本而导致的更改

但是如果我再拉一点呢

  • 用户进行了更改,用户更改使数据无效
  • 用户所做的更改是否因文件已被删除而过时
一个例子是,在用户对所述文件夹中的文件进行编辑后,在要上载的
堆栈上的更改上,pull删除文件夹。因此,当用户在更改列表上按下操作时,拉操作当前起作用,因为更改已经在本地完成

我想到的处理这个问题的一种方法是,在我从服务器拉取数据时,不允许任何用户更改。然后,我根据拉操作更改UI并再次启用更改。
但我不知道推送需要多长时间,因此UI在一段时间内无法更改内容可能是糟糕的用户体验


其他人如何处理(或避免)使用户所做更改无效的拉取?

我试图避免覆盖在拉取时所做的用户更改。例子: 我有一个文件,当我拉下该文件的另一个版本时,用户保存了对该文件的更改

本地用户更改已排队。 因此,一旦我完成拉取并开始推送用户本地更改,我就会推送一个不再反映本地缓存的更改

当我尝试推送它时,我肯定会遇到版本错误,是否需要在本地和服务器上合并更改

为了避免这个问题,我可以等待更改排队,但将其命名为
建议的
更改,我在拉取过程中识别该更改并可以对其采取行动。如果拉取的更改与
建议的
不兼容,我可以拒绝
建议的
更改,并将冲突告知用户

注意:此问题与
CKError.code.serverChangedError
不同,因为它仅与拉取期间所做的更改相关

TLDR:拉、推和本地更改不应同时发生

  • 推送过程中的本地更改是可以的,它们只是添加到要推送的下一批更改中。在推送之前,我必须清空推送本地更改批处理并将本地缓存锁定到建议的模式,这样就避免了问题
  • 拉取过程中的局部更改成为提议的更改,必须在合并拉取数据期间或之后确定这些更改的有效性,并通过通知用户采取行动
将建议的更改链接到本地缓存对象是必要的,这样拉合并可以通知建议的更改并在其中存储更改的对象,因此建议的更改可能无效

链接到提议的更改的另一种方法是在对象中有一个版本号,并在每次更改时增加版本号(特别是在从拉合并进行更改时)。在创建时,建议的更改保存它要更改的对象的版本号。拉合并后,当评估建议的更改时,可以通过比较对象内部的版本号与存储在对象建议更改中的版本号来评估

-----------

另一种选择是——在拉取所有更改之后——不直接合并它们,而是先推送更改,直到不再有本地更改,然后阻止本地更改并合并拉取的更改

我不必担心拉合并冲突,因为我已经将推送上的用户更改调整为服务器更改,所以拉不能使刚刚推送的用户所做的更改无效

------

备选方案3是:提取所有以前提取的内容,直到用户在提取过程中未做任何更改。然后在合并获取的记录时立即锁定数据库

注意:上传并修复所述记录的合并冲突后,可以对记录进行远程更改