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

Cod*_*224 5 core-data realm ios swift cloudkit

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

我想要:

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

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

Mat*_*man 16

CloudKit并且CoreData不会自动无缝地协同工作,因此您需要自己编写该逻辑.

不同类型的iCloud存储选项,其中一个或两个可以无缝集成CoreData,但CloudKit不是其中之一,CloudKit如果您希望用户能够与他人共享数据,那么您需要使用它们.

AKA:你需要自己做繁重的工作,但如果你使用好的设计实践,你可以做一次工作,而不必重写你现有的大部分代码.

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

  • NSManagedObject像你几乎肯定已经拥有的那样创建核心数据对象模型和子类.

  • 在Xcode项目功能中打开CloudKit并登录CloudKit Dashboard

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

  • (返回Xcode)在某处创建方法(最方便地作为NSManagedObject子类的扩展),知道如何从a创建给定的Core Data对象CKRecord,并CKRecord从Core Data对象创建.

  • 创建一个或多个专用于处理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自动确保Core Data中的所有更改都反映在iCloud中反之亦然.

至于与其他用户共享,此功能在iOS 10中是新功能,并且似乎Apple尚未更新CloudKit快速入门.因此,您应该今年的WWDC上观看CloudKit的新功能.

重要说明:在CloudKit仪表板中设计记录模型时,请务必遵循" iCloud设计指南",不要使用包含子记录类型数组的字段的父记录类型.这不是很好的表现.而是将子记录类型定义为具有CKReference指向其父级的单个字段.这样,如果您需要父项的子项,您可以创建一个查询,请求所有对象的父项设置为您想要的父项(而不是必须等待所有子项下载,只要您想要的是父母).

以下是一些WWDC会议.较旧的会话仍然包含非常有用的信息,但其中一些已经过时.