CoreData 和 iCloud;如何跟踪上次保存到云端的设备?

Posted

技术标签:

【中文标题】CoreData 和 iCloud;如何跟踪上次保存到云端的设备?【英文标题】:CoreData and iCloud; how can I track which device last saved to the cloud? 【发布时间】:2014-02-13 21:13:44 【问题描述】:

我有一个由 iCloud 支持的 CoreData 应用程序(使用 https://github.com/lhunath/UbiquityStoreManager)。在一个用例中,具有本地存储的用户启用 iCloud(其中数据已经存在)。我想提示用户决定是将本地数据迁移到 iCloud 还是只使用 iCloud 版本。作为其中的一部分,我想在 iCloud 中显示版本的设备名称和上次同步日期。

我一直在修改我的 NSPersistentStore 的元数据,但似乎没有同步到 iCloud。

有什么建议吗?

【问题讨论】:

【参考方案1】:

您可以使用 iCloud 的键值存储来存储设备名称和上次同步的日期。

【讨论】:

是的,考虑到这一点。不幸的是,无法保证 k/v 存储与 iCloud 文档同步。【参考方案2】:

毫无疑问,我不受欢迎的建议是“不要”。试图在任何给定时间确定 iCloud 中的内容会使您处于非常不稳定的境地。您可能在大多数情况下都能让它工作,但总会有出现故障的情况。

如果您确实必须在首次启用 iCloud 时导入一些数据,我建议您始终导入数据,然后在 iCloud 数据进入时进行重复数据删除。尽管听起来很难看,但这是唯一能保证与 Apple 的接近。

值得看看其他核心数据同步框架,如 TICDS 和 Ensembles。他们对数据身份采取了一种更理智的方法,这意味着您可以避免整个重复数据删除步骤。 (披露:我开发 Ensembles)

【讨论】:

我同意。上面邓肯的建议很方便,但 iCloud 确实不能保证另一台设备是否已上传其更新以及另一台设备是否已下载所有更新。 另外,感谢有关 Ensembles 的提醒。我检查了 TICDS,但不喜欢它,因为数据仍然由 SQLite 存储支持,其内部是 Apple 私有 API 的一部分。【参考方案3】:

对 iCloud 文件进行元数据查询并检查 iCloud 中最新的事务日志文件。有关使用此方法检查应用是否与 iCloud 正确同步的示例应用,请参阅下面的链接。http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

编辑: 我刚刚意识到我没有得到实际的设备名称,但是一旦你找到了最新的日志文件,然后使用它来获取设备。请注意,此调用可能很昂贵。

NSFileVersion *openedVersion = [NSFileVersion currentVersionOfItemAtURL:fileURL];
    return openedVersion.localizedNameOfSavingComputer;

【讨论】:

以上是关于CoreData 和 iCloud;如何跟踪上次保存到云端的设备?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:SharedCoreData 示例代码 (iCloud + CoreData) |如何合并更改

iCloud中的CoreData和照片问题[重复]

iCloud + 预加载的 CoreData

iOS 7 中的 iCloud、Core Data 和来自 Web 服务的数据

如何将 CoreData 存储到 iCloud 帐户 iOS 编程?

如何解决由于 iCloud 合并而导致的“CoreData:错误:严重的应用程序错误”?