gpt4 book ai didi

swift/Cloudkit : Handling user-changes while pulling

转载 作者:行者123 更新时间:2023-11-30 11:16:39 24 4
gpt4 key购买 nike

我从this StackOverflow question知道以及来自Basic CloudKit Workflow与 Cloudkit 同步的流行方法是首先推送本地更改,然后拉取远程更改,这样我就可以在推送过程中通过查看更改由于服务器上的较新版本而失败来检测更改。

但是如果我拉得更久怎么办

  • 用户进行了更改并且用户更改导致提取的数据无效?
  • 用户所做的更改由于文件已被删除而变得过时?

一个示例是,在用户对待上传堆栈上的更改的文件夹中的文件进行编辑后,拉动会删除该文件夹。因此,当用户在更改列表上推送操作时,拉动当前可以工作,因为更改已经在本地完成。

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

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

最佳答案

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

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

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

为了避免这个问题,我可以等待对更改进行排队,但将其命名为我在拉取期间识别并可以采取行动的提议更改。如果拉取的更改与提议的不兼容,我可能会拒绝提议的更改并通知用户冲突。

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

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

  • 推送期间的本地更改是可以的,它们只是添加到下一批要推送的更改中。在推送之前,我必须清空 Push-local-changes 批处理并将本地缓存锁定为提议模式,这样就可以避免出现问题。
  • 拉取期间的本地更改将成为建议的更改,必须在合并拉取的数据期间或之后确定其有效性,并通过通知用户采取行动。

将建议的更改链接到本地​​缓存对象是必要的,以便拉合并可以通知建议的更改并将对象更改存储在其中,因此建议的更改可能无效。

链接到建议更改的另一种方法是在对象中添加版本号,并在每次更改时增加版本号(尤其是在拉取合并的更改期间)。在创建时,建议的更改保存它想要更改的对象的版本号。拉合并后,当评估建议的更改时,可以通过将对象内的版本号与存储在对象的建议更改中的版本号进行比较来评估。

———————————

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

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

—————

替代方案 3 是:获取之前拉取的所有内容,直到用户在拉取过程中没有进行任何更改。然后在合并获取的记录时短暂锁定数据库。

注意:上传并修复该记录的合并冲突后,可以放弃对记录的远程更改。

关于 swift/Cloudkit : Handling user-changes while pulling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51684104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com