我使用Core Data编写了一个使用Swift 2的应用程序来实现持久性。我正在考虑添加一个功能,以便在云端持续存在。我已经阅读过关于Realm和CloudKit的教程,但是没有看到在核心数据之上(或同时)使用它们的很好的例子。
我想:
我可以保留所有核心数据逻辑,只需在使用CloudKit(或其他一些框架)的CRUD操作期间添加一些服务器调用吗?例如,我对我的几个表使用NSFetchedResultsController
,在使用CloudKit时继续使用它是否有意义?
答案 0 :(得分:16)
CloudKit
和CoreData
无法自动无缝协作,因此您需要自己编写该逻辑。
有different types of iCloud storage options,其中一个或两个与CoreData
无缝集成,但CloudKit
不是其中之一,CloudKit
是您需要的如果您希望让用户与他人共享数据,请使用。
AKA:您需要自己进行繁重的工作,但如果您使用良好的设计实践,则无需重写现有代码即可完成一次工作。
所以,这里有类似于我在一个使用两个框架的项目中所做的事情:
创建核心数据对象模型和NSManagedObject
子类,就像你几乎肯定已经拥有的那样。
在Xcode项目功能中启用CloudKit并登录CloudKit仪表板
使用CloudKit仪表板设计以核心数据实体模型为模型的记录模型
(返回Xcode)在某处创建方法(最方便地作为NSManagedObject
子类的扩展),知道如何从CKRecord
创建给定的Core Data对象,并创建一个来自Core Data对象的CKRecord
。
创建一个或多个专门用于处理CloudKit记录并将其与Core Data同步的Swift类。这个类将负责执行高级别的所有CloudKit操作,包括获取,添加,删除,修改等。您可以根据需要设计此公共API(它应根据您的需要进行定制),但是这样class很可能会使用您在上一步中创建的方法来转换为Core Data类型和从Core Data类型转换。
通过这种方法,您的CloudKit专业化课程(我们称之为CloudBrain
)可以完成所有繁重工作,如果您愿意,您可以在幕后完成所有工作。例如,您可以定义另一个类SyncBrain
,它将自动侦听Core Data托管对象上下文中的更改,并调用CloudBrain
上的相应方法以确保所有更改与iCloud保持同步。它还需要反过来,监听iCloud中的更改并将其应用于Core Data。这当然需要最初从CloudBrain
获取更改,您还需要查看CKSubscription
进行实时更新。
这种方法的优点在于,如果您正确设置所有这些,您可以保持所有其他代码相同,因为每当您的其他类与Core Data交互时,SyncBrain
会自动确保所有代码核心数据的变化反映在iCloud中,反之亦然。
至于与其他用户共享,此功能在iOS 10中是新功能,并且似乎Apple尚未更新CloudKit Quick Start。因此,您应该在今年的WWDC上观看What's New with CloudKit。
重要说明:在CloudKit仪表板中设计记录模型时,请务必遵循iCloud Design Guide并且不要使用包含子记录类型数组的字段的父记录类型。这不是很好的表现。相反,将子记录类型定义为具有指向其父级的单个CKReference
字段。这样,如果您需要父项的子项,您可以创建一个查询,请求所有对象的父项设置为您想要的父项(而不是必须等待所有子项下载,只要您想要的是亲本)。
以下是一些WWDC会议。较旧的会话仍然包含非常有用的信息,但其中一些已经过时。
答案 1 :(得分:2)
现在,在Xcode 11中,您可以将Core Data镜像到云中。看起来也确实很容易。您只需要使用NSPersistentCloudKitContainer
而不是NSPersistentContainer
。您的数据将自动与CloudKit同步。
有关更多信息,请参见documentation。
PS。撰写本文时,它是beta版。