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

时间:2016-10-14 04:12:00

标签: ios swift core-data realm cloudkit

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

我想:

  1. 允许用户输入一次数据并将其显示在所有设备上。
  2. 让用户与他们选择的用户同步一些数据。
  3. 我可以保留所有核心数据逻辑,只需在使用CloudKit(或其他一些框架)的CRUD操作期间添加一些服务器调用吗?例如,我对我的几个表使用NSFetchedResultsController,在使用CloudKit时继续使用它是否有意义?

2 个答案:

答案 0 :(得分:16)

CloudKitCoreData无法自动无缝协作,因此您需要自己编写该逻辑。

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版。