0

我正在使用 iCloud 在设备之间存储同步用户首选项。在设备上,这些存储在 'Favorite Teams' 数组中NSUserDefaults,我正在使用MKiCloudSync将它们镜像到NSUbiquitousKeyValueStore. 一台设备上的更改正在传播到第二台设备。

但我不确定如何防止在新安装后首次启动时擦除云数据。这是正在发生的事情:

  1. 设备 A 首次启动。应用程序在云中找不到任何东西。用户将多个项目添加到 NSUserDefaults 中的数组中。更改会立即同步到云端。
  2. 设备 B 首次启动,但处于离线状态。用户将单个项目添加到NSUserDefaults数组中,然后记住应用程序支持 iCloud,因此找到了一些 wifi。
  3. 设备 B 将其默认版本推送到云端(只有一项)。设备 A 将其拉出,有效地消灭了设备 A 上添加的所有团队。

这是 iCloud 的限制还是我的实现幼稚?文档解决了同步“最高级别”的类似问题,并添加了应用程序逻辑以永远不会用较小的值覆盖该值。当有一些明确的业务逻辑要遵守时,这很好(更高级别始终是要保留的),但是当数据更加随意时,我不知道如何确定要做什么。

或者是因为我在 NSUserDefaults 中为“最喜欢的团队”使用了一个数组并批发替换它?如果我为每个团队使用单独的密钥,也许它们会根据时间码独立同步?

4

1 回答 1

1

每次同步特定密钥的值时,都会冒着被使用相同帐户的不同设备更改的风险。iCloud 服务会为您选择胜出的价值、进行更新并在完成时通知您。这是 iCloud 和您的应用程序的限制,并且是同步困难的一个简单示例。如果您上面的第 2 步看起来像这样:

设备 B 首次启动,并且 iCloud 可用。该应用程序从设备 A 下载当前数据。用户改变主意并删除他们在设备 A 上创建的所有数据。然后他们是一个新项目。

那么,然后呢?步骤 3 仍然完全按照您的描述发生,只是这次传入的数据是用户想要的。你可以重构你的数据,但同样的情况仍然可能发生。

一种选择是保留数据的非同步本地副本,以便您可以将传入的更改与之前的本地状态进行比较。当它们不同时该怎么做取决于您。只是不要忘记,即使是剧烈的变化也可能正是用户想要的,而不是需要修复的同步问题。或者,它们可能会丢失用户想要保留的数据。解决这个冲突是你的工作。

于 2013-06-17T18:08:41.840 回答