将使用核心数据的 iOS 应用程序同步到云端
Sync an iOS app that uses core data to cloud
我已经用 Swift 2 使用 Core Data 编写了一个应用程序来实现持久性。我正在考虑添加一项功能以在云中持久保存。我已经阅读了关于 Realm 和 CloudKit 的教程,但还没有看到在核心数据之上(或与核心数据一起)使用它们的很好的例子。
我想:
- 允许用户输入他们的数据一次,并在他们的所有设备上显示。
- 让用户与他们选择的用户同步他们的一些数据。
我可以保留我所有的核心数据逻辑并在 CRUD 操作期间使用 CloudKit(或其他一些框架)简单地添加一些服务器调用吗?例如,我对我的几个表使用 NSFetchedResultsController
,在使用 CloudKit 的同时继续使用它是否有意义?
CloudKit
和 CoreData
不会自动无缝地协同工作,因此您需要自己编写该逻辑。
有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 会议。较旧的会话仍然包含非常有用的信息,但其中一些已过时。
- 2014 – Introducing CloudKit(A must-watch 让概念正确)
- 2014 – Advanced CloudKit
- 2015 – What's New in CloudKit
- 2015 – CloudKit Tips and Tricks
- 2016 – What's New with CloudKit
- 2016 – CloudKit Best Practices
在Xcode11中,您现在可以将Core Data镜像到云端。这似乎也很容易做到。您只需要使用 NSPersistentCloudKitContainer
而不是 NSPersistentContainer
。您的数据将自动与 CloudKit 同步。
有关详细信息,请参阅 documentation。
PS。在撰写本文时,这是测试版。
我已经用 Swift 2 使用 Core Data 编写了一个应用程序来实现持久性。我正在考虑添加一项功能以在云中持久保存。我已经阅读了关于 Realm 和 CloudKit 的教程,但还没有看到在核心数据之上(或与核心数据一起)使用它们的很好的例子。
我想:
- 允许用户输入他们的数据一次,并在他们的所有设备上显示。
- 让用户与他们选择的用户同步他们的一些数据。
我可以保留我所有的核心数据逻辑并在 CRUD 操作期间使用 CloudKit(或其他一些框架)简单地添加一些服务器调用吗?例如,我对我的几个表使用 NSFetchedResultsController
,在使用 CloudKit 的同时继续使用它是否有意义?
CloudKit
和 CoreData
不会自动无缝地协同工作,因此您需要自己编写该逻辑。
有different types of iCloud storage options,其中一两个与CoreData
无缝集成,但CloudKit
不是其中之一,CloudKit
就是你想要的如果您希望让您的用户能够与他人共享数据,则需要使用它。
又名: 您将需要自己完成繁重的工作,但如果您使用良好的设计实践,您只需完成一次工作,而无需重写大部分现有代码。
所以,这与我在使用这两种框架的一个项目中所做的类似:
创建核心数据 object 模型和
NSManagedObject
子class 几乎肯定已经有了。在Xcode项目功能中开启CloudKit并登录到CloudKit仪表板
使用 CloudKit 仪表板设计以 Core Data 实体模型为模型的记录模型
(回到 Xcode)在某处创建知道如何创建给定核心的方法(作为
NSManagedObject
子 classes 的扩展最方便)数据 object 来自CKRecord
,并从核心数据 object. 创建 创建一个或多个 Swift classes 专门用于处理您的 CloudKit 记录并将它们与 Core Data 同步。这个 class(es) 将负责在高层执行所有 CloudKit 操作,包括获取、添加、删除、修改等。您可以设计这个 public API 但是你想要(它应该根据你的需要定制),但是这个 class 很可能会使用你在上一步中创建的方法来转换核心数据类型。
CKRecord
通过这种方法,您的 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 会议。较旧的会话仍然包含非常有用的信息,但其中一些已过时。
- 2014 – Introducing CloudKit(A must-watch 让概念正确)
- 2014 – Advanced CloudKit
- 2015 – What's New in CloudKit
- 2015 – CloudKit Tips and Tricks
- 2016 – What's New with CloudKit
- 2016 – CloudKit Best Practices
在Xcode11中,您现在可以将Core Data镜像到云端。这似乎也很容易做到。您只需要使用 NSPersistentCloudKitContainer
而不是 NSPersistentContainer
。您的数据将自动与 CloudKit 同步。
有关详细信息,请参阅 documentation。
PS。在撰写本文时,这是测试版。