如何在 iCloud 中强制版本冲突

Posted

技术标签:

【中文标题】如何在 iCloud 中强制版本冲突【英文标题】:How to force a version conflict in iCloud 【发布时间】:2012-04-11 15:08:29 【问题描述】:

我有一个可用的 iCloud 实现。现在我想通过添加一些合并功能来改进冲突处理。我一直在尝试提出一种一致的方法来强制冲突以进行测试,但到目前为止我还没有运气,当我期望冲突发生时,冲突并不会持续发生。这可能表明我做错了什么,或者我只是误解了 iCloud 的工作原理(我的意思是另一件事)。

我正在使用 UIDocument,是的,我正在收听 UIDocumentStateChangedNotification。事实上,我确实偶尔会收到一些冲突通知。另外,我在 iCloud 中只有一个文件。

有两台设备使用相同的 iCloud 帐户,以下是我期望总是会导致冲突的事件流:

在两台设备上打开文件(两台设备现在都可以正确看到相同的内容)。 注意:这是唯一一次调用 openWithCompletionHandler ,之后就再也没有调用过。 在设备 A 上进行一些更改并调用 saveToURL。 等待一段时间,让更改传播。 在设备 B 上进行一些其他更改并调用 saveToURL。 等待一段时间,让更改传播。 预期:应用应该从 iCloud 收到冲突通知。 观察到:冲突确实偶尔发生,但大多数情况下发生的只是 UIDocument 设置其 UIDocumentStateEditingDisabled 标志,然后在半秒左右后清除(我猜编辑是在 iCloud 守护进程从其他设备提取版本并将其保存在本地普遍存在的目录中时被禁用。

很像 SVN 之类的版本控制系统,我预计来自设备 B 的版本会导致冲突,因为需要“更新”才能让设备 A 上传版本。

我在刚才描述的场景中期待冲突是错误的吗?为什么?有没有其他方法可以持续地强迫冲突?

谢谢!

【问题讨论】:

【参考方案1】:

我原以为引发冲突的更好方法是:

确保两台设备都有最新的数据副本 将两台设备都置于飞行模式以防止任何 iCloud 更新 更改两台设备上相同位置的数据,每台设备都有不同的新数据 重新开启网络 等待更改传播

From the docs:

当应用程序的两个实例在本地更改一个文件,然后将这两个更改都传输到 iCloud 时,就会发生冲突。例如,当设备处于飞行模式时进行更改并且无法立即将更改传输到 iCloud 时,可能会发生这种情况。当它发生时,iCloud 会存储文件的两个版本,并通知应用程序的文件提供者发生冲突并需要解决。

您这样做的方式(允许同步时间,以不同方式更改文档)似乎不应该引起冲突。

【讨论】:

【参考方案2】:

iCloud 的工作原理与版本控制系统基本相同 - 除了您只能访问冲突版本(发生冲突时)。

当设备从 iCloud 中提取 ver_1、编辑、保存并发现服务器的版本(ver_2 或更高)与预期不同时,将创建一个冲突的版本。

初始同步后,您可以:

    关闭设备 B 上的 wifi,编辑并保存。 在设备 A 上编辑,保存。 在设备 B 上打开 wifi。

很快就会发生冲突。

【讨论】:

以上是关于如何在 iCloud 中强制版本冲突的主要内容,如果未能解决你的问题,请参考以下文章

iCloud-CoreData 解决冲突

使用 iCloud 解决核心数据中的冲突

如何在 Perforce 中控制版本号?

如何解决 UIManagedDocument 中的冲突?我应该使用 NSFileVersion 吗?

如何解决Jquery版本冲突[重复]

如何删除maven中冲突的jar包