将使用核心数据的 iOS 应用程序同步到云端

Sync an iOS app that uses core data to cloud

我已经用 Swift 2 使用 Core Data 编写了一个应用程序来实现持久性。我正在考虑添加一项功能以在云中持久保存。我已经阅读了关于 Realm 和 CloudKit 的教程,但还没有看到在核心数据之上(或与核心数据一起)使用它们的很好的例子。

我想:

  1. 允许用户输入他们的数据一次,并在他们的所有设备上显示。
  2. 让用户与他们选择的用户同步他们的一些数据。

我可以保留我所有的核心数据逻辑并在 CRUD 操作期间使用 CloudKit(或其他一些框架)简单地添加一些服务器调用吗?例如,我对我的几个表使用 NSFetchedResultsController,在使用 CloudKit 的同时继续使用它是否有意义?

CloudKitCoreData 不会自动无缝地协同工作,因此您需要自己编写该逻辑。

different types of iCloud storage options,其中一两个与CoreData无缝集成,但CloudKit不是其中之一,CloudKit就是你想要的如果您希望让您的用户能够与他人共享数据,则需要使用它。

又名: 您将需要自己完成繁重的工作,但如果您使用良好的设计实践,您只需完成一次工作,而无需重写大部分现有代码。

所以,这与我在使用这两种框架的一个项目中所做的类似:

  • 创建核心数据 object 模型和 NSManagedObject 子class 几乎肯定已经有了。

  • 在Xcode项目功能中开启CloudKit并登录到CloudKit仪表板

  • 使用 CloudKit 仪表板设计以 Core Data 实体模型为模型的记录模型

  • (回到 Xcode)在某处创建知道如何创建给定核心的方法(作为 NSManagedObject 子 classes 的扩展最方便)数据 object 来自 CKRecord,并从核心数据 object.

  • 创建 CKRecord
  • 创建一个或多个 Swift classes 专门用于处理您的 CloudKit 记录并将它们与 Core Data 同步。这个 class(es) 将负责在高层执行所有 CloudKit 操作,包括获取、添加、删除、修改等。您可以设计这个 public API 但是你想要(它应该根据你的需要定制),但是这个 class 很可能会使用你在上一步中创建的方法来转换核心数据类型。

通过这种方法,您的 CloudKit 专业化 class(我们称之为 CloudBrain)完成了所有繁重的工作,如果您愿意,您可以让它完成都在幕后。例如,您可以定义另一个 class、SyncBrain,它会自动侦听 Core Data 管理的 object 上下文中的变化,并在 CloudBrain 上调用相应的方法以确保所有更改与 iCloud 保持同步。它还需要做相反的事情,监听 iCloud 中的变化并将它们应用到 Core Data。这当然需要首先从 CloudBrain 获取更改,您还需要查看 CKSubscription 以获取 real-time 更新。

这种方法的美妙之处在于,如果你正确地设置了所有这些,你可以保持所有其他代码相同,因为每次你的其他 classes 与 Core Data 交互时,SyncBrain 自动确保核心数据中的所有更改都反映在 iCloud 中,反之亦然。

至于与其他用户分享,这个功能是 iOS 10 中的新功能,而且似乎 Apple 今年还没有从 WWDC 更新 CloudKit Quick Start. You should therefore watch What's New with CloudKit

重要提示:在 CloudKit 仪表板中设计记录模型时,请务必遵循 iCloud Design Guide 而不是 parent 记录具有 child 记录类型数组的字段的类型。这不是很好的表现。相反,将 child 记录类型定义为具有指向其 parent 的单个 CKReference 字段。这样,如果您需要 parent 的 children,您只需创建一个查询来请求所有 object 并将其 parent 设置为 parent你想要的(而不是等待所有 children 下载,而你想要的只是 parent)。

这里有一些 WWDC 会议。较旧的会话仍然包含非常有用的信息,但其中一些已过时。

在Xcode11中,您现在可以将Core Data镜像到云端。这似乎也很容易做到。您只需要使用 NSPersistentCloudKitContainer 而不是 NSPersistentContainer。您的数据将自动与 CloudKit 同步。

有关详细信息,请参阅 documentation

PS。在撰写本文时,这是测试版。