我的目标是: 1. 允许用户只输入一次数据,然后在所有设备上都可以访问。 2. 让用户将他们的一些数据与其他用户同步。
我是否可以保留所有Core Data逻辑,并在CRUD操作期间添加一些服务器调用来使用CloudKit(或其他框架)?例如,我为多个表使用NSFetchedResultsController,那么在使用CloudKit时继续使用它是否有意义?
CloudKit
和CoreData
不能自动无缝地协同工作,所以您需要自己编写逻辑。
有不同类型的iCloud存储选项,其中一两个与CoreData
无缝集成,但CloudKit
不是其中之一,如果您希望让用户与其他人共享数据,则需要使用CloudKit
。
即:您需要自己费力编写代码,但如果使用良好的设计实践,可以只做一次工作而不必重写现有代码。
因此,以下是类似于我在使用两个框架的项目中所做的内容:
创建Core Data对象模型和NSManagedObject
子类,就像您几乎肯定已经做过的那样。
在Xcode项目能力中打开CloudKit并登录到CloudKit Dashboard。
使用CloudKit Dashboard根据您的Core Data实体模型设计记录模型。
(回到Xcode) 在某个地方创建方法(最方便的方式是作为NSManagedObject
子类的扩展),使其知道如何从CKRecord
创建给定的Core Data对象,并从Core Data对象创建CKRecord
。
创建一个或多个专门处理CloudKit记录并将其与Core Data同步的Swift类。该类将负责在高级别上执行所有CloudKit操作,包括获取、添加、删除、修改等。您可以根据需要设计此公共API,但是该类最有可能使用先前步骤中创建的方法将类型转换为和从Core Data类型转换。
CloudBrain
)完成了所有繁重的工作,如果你想要的话,你可以让它在幕后完成所有工作。例如,你可以定义另一个类,SyncBrain
,它会自动监听Core Data受管对象上下文中的更改,并调用CloudBrain
上的相应方法,以确保所有更改都与iCloud同步。它还需要反向操作,监听iCloud中的更改并将它们应用于Core Data。当然,这将首先需要从CloudBrain
获取更改,你还需要了解CKSubscription
以进行实时更新。SyncBrain
会自动确保Core Data中的所有更改都反映在iCloud中,反之亦然。重要提示:在CloudKit Dashboard中设计记录模型时,请务必遵循iCloud Design Guide,不要使用具有包含子记录类型数组的字段的父记录类型。这对性能不利。相反,定义子记录类型具有一个指向其父对象的单个CKReference
字段。这样,如果您需要父记录的子记录,您只需创建一个查询请求所有对象,并将它们的父对象设置为您想要的父对象(而不是在您只需父对象时等待下载所有子记录)。
以下是一些WWDC会议。较旧的会议仍然包含非常有用的信息,但其中一些已过时。
在Xcode 11中,你现在可以将Core Data镜像到云端。这似乎也很容易做到。你只需要使用NSPersistentCloudKitContainer
而不是NSPersistentContainer
即可。你的数据将自动与CloudKit同步。
更多信息请参见文档。
附言:截至撰写本文时,此功能处于beta测试阶段。
CKFetchRecordChangesOperation
也是一个不错的选择,但根据我的经验,我曾经遇到过 CloudKit 无法准确返回所有更改的问题。 - Matthew SeamanNSCoding
/NSKeyedArchiver
进行持久化,然后尝试在后台或每次应用程序启动时出队列。这听起来合理吗?你对这个问题有什么经验? - Coder1224