通过 Parse 同步核心数据
Core data sync via Parse
我有兴趣开发一个库,该库将通过 Parse 移动后端在设备之间同步核心数据模型。我想镜像 iCloud 核心数据同步尝试提供的功能。
为什么不使用 iCloud 或 Ensembles?
我目前正在生产应用程序中使用 iCloud 核心数据同步,它是 not working well for me. I also want to provide authentication independent of the Apple ID which is another reason I want to get away from iCloud. As far as Ensembles is concerned, I am not sure if this will still work with Dropbox due the deprecation of the dropbox sync API。
我还没有开始开发库。我正在寻找对我的计划的反馈,概述如下。此设计基于 this SO answer。
图书馆的总体设计:
该库将提供一个标准的核心数据堆栈,用于设置持久存储协调器和托管对象上下文。所有标准核心数据 CRUD 操作都将通过库提供的接口进行。
每次发生 CUD 操作时,都会在后台将同步操作对象保存到 Parse,其中包括重现该操作所需的所有信息。这包括:发生的操作类型、被操作对象的唯一标识符,以及在创建操作的情况下,将提供父对象和关系。
- 每个操作都会有一个与之关联的 change_id 编号。每次设备下载并执行操作时,它都会存储与该操作关联的最新 change_id。
- 在上传每个同步操作之前,设备会向服务器发送请求以确保存储的 change_id 号码与本地存储的号码相匹配。如果服务器上的 change_id 更高,它将首先下载所有同步操作并执行它们,然后上传自己的同步操作。
- 冲突(两台设备在离线时编辑相同的值)将通过确定最后更改值的设备来解决。
我在这里遗漏了什么吗?这种方法有哪些潜在的缺陷?我听说同步很难,这种类型的工作应该留给最有经验的开发人员吗?
我不是最有偏见的回应者,因为我是 Ensembles 框架的开发者,但让我谈谈一些想法。
关于 Ensembles 本身,它是一个与后端无关的框架。是的,它确实适用于 iCloud 和 Dropbox Sync API,但也适用于 CloudKit、Dropbox Core API(未弃用)和 WebDAV。还有一个自定义的 Node.js 服务器,带有一个软件包,允许您使用 Heroku 和 S3 自己托管数据。
因此,即使您不想坚持使用 Apple,也有其他选择。但更重要的是,您可以编写自己的后端适配器 class。大多数大约有 500 行代码,您可以将其基于现有的 classes 之一。这将允许您创建一个存储数据并使用 Parse 进行身份验证的后端,并将数据合并留给 Ensembles。这样做的另一个好处是您将来可以轻松地转移到其他后端,或者将它们作为选项提供。 (CloudKit绝对值得一看。)
但假设您决心不使用其他人的框架,那么是的,您的方法在全球范围内听起来都是正确的。
无需通过接口进行 CRUD 操作,您只需观察 NSManagedObjectContextDidSaveNotification
并从 userInfo
字典中提取更改。
我相信您会发现很多您没有想到的小事,正是这些细节往往会使同步变得困难。一个这样的例子是,您需要构建足够健壮的东西来处理故障,例如在应用程序退出之前 Parse 操作未完成。您可能需要在每个对象上都有一个更改标签,以便您可以检索自上次同步以来发生更改的对象。
如果你的应用程序有少量数据,构建这个系统并不难,但随着你的数据开始变大,你需要开始使用诸如批处理之类的东西来保持内存中的数据较少iOS。这种事情可能需要很多时间。例如,Ensembles 2 与 Ensembles 1 几乎完全相同 API,但我花了大约 4 个月的时间重写批处理等内容以提高内存效率。
我使用您描述的方法构建了一个原型应用程序(应用程序是社交的,不同步,因此没有 Ensembles)。我使用了 CloudKit,这与 Parse 非常相似。使用本地核心数据缓存,大约需要 1000 行 Swift 代码才能使整个数据 upload/download 正常工作。这当然是可行的,特别是如果您已经很了解 Core Data 的话。否则可能会有学习曲线。
我对像 Ensembles 这样的框架的提倡很简单,它已经解决了许多你需要解决的小细节,它不会把你锁在一个特定的后端。如果 Parse 决定提高他们的费用,您可以自由地搬到其他地方。
我有兴趣开发一个库,该库将通过 Parse 移动后端在设备之间同步核心数据模型。我想镜像 iCloud 核心数据同步尝试提供的功能。
为什么不使用 iCloud 或 Ensembles? 我目前正在生产应用程序中使用 iCloud 核心数据同步,它是 not working well for me. I also want to provide authentication independent of the Apple ID which is another reason I want to get away from iCloud. As far as Ensembles is concerned, I am not sure if this will still work with Dropbox due the deprecation of the dropbox sync API。
我还没有开始开发库。我正在寻找对我的计划的反馈,概述如下。此设计基于 this SO answer。
图书馆的总体设计:
该库将提供一个标准的核心数据堆栈,用于设置持久存储协调器和托管对象上下文。所有标准核心数据 CRUD 操作都将通过库提供的接口进行。
每次发生 CUD 操作时,都会在后台将同步操作对象保存到 Parse,其中包括重现该操作所需的所有信息。这包括:发生的操作类型、被操作对象的唯一标识符,以及在创建操作的情况下,将提供父对象和关系。
- 每个操作都会有一个与之关联的 change_id 编号。每次设备下载并执行操作时,它都会存储与该操作关联的最新 change_id。
- 在上传每个同步操作之前,设备会向服务器发送请求以确保存储的 change_id 号码与本地存储的号码相匹配。如果服务器上的 change_id 更高,它将首先下载所有同步操作并执行它们,然后上传自己的同步操作。
- 冲突(两台设备在离线时编辑相同的值)将通过确定最后更改值的设备来解决。
我在这里遗漏了什么吗?这种方法有哪些潜在的缺陷?我听说同步很难,这种类型的工作应该留给最有经验的开发人员吗?
我不是最有偏见的回应者,因为我是 Ensembles 框架的开发者,但让我谈谈一些想法。
关于 Ensembles 本身,它是一个与后端无关的框架。是的,它确实适用于 iCloud 和 Dropbox Sync API,但也适用于 CloudKit、Dropbox Core API(未弃用)和 WebDAV。还有一个自定义的 Node.js 服务器,带有一个软件包,允许您使用 Heroku 和 S3 自己托管数据。
因此,即使您不想坚持使用 Apple,也有其他选择。但更重要的是,您可以编写自己的后端适配器 class。大多数大约有 500 行代码,您可以将其基于现有的 classes 之一。这将允许您创建一个存储数据并使用 Parse 进行身份验证的后端,并将数据合并留给 Ensembles。这样做的另一个好处是您将来可以轻松地转移到其他后端,或者将它们作为选项提供。 (CloudKit绝对值得一看。)
但假设您决心不使用其他人的框架,那么是的,您的方法在全球范围内听起来都是正确的。
无需通过接口进行 CRUD 操作,您只需观察 NSManagedObjectContextDidSaveNotification
并从 userInfo
字典中提取更改。
我相信您会发现很多您没有想到的小事,正是这些细节往往会使同步变得困难。一个这样的例子是,您需要构建足够健壮的东西来处理故障,例如在应用程序退出之前 Parse 操作未完成。您可能需要在每个对象上都有一个更改标签,以便您可以检索自上次同步以来发生更改的对象。
如果你的应用程序有少量数据,构建这个系统并不难,但随着你的数据开始变大,你需要开始使用诸如批处理之类的东西来保持内存中的数据较少iOS。这种事情可能需要很多时间。例如,Ensembles 2 与 Ensembles 1 几乎完全相同 API,但我花了大约 4 个月的时间重写批处理等内容以提高内存效率。
我使用您描述的方法构建了一个原型应用程序(应用程序是社交的,不同步,因此没有 Ensembles)。我使用了 CloudKit,这与 Parse 非常相似。使用本地核心数据缓存,大约需要 1000 行 Swift 代码才能使整个数据 upload/download 正常工作。这当然是可行的,特别是如果您已经很了解 Core Data 的话。否则可能会有学习曲线。
我对像 Ensembles 这样的框架的提倡很简单,它已经解决了许多你需要解决的小细节,它不会把你锁在一个特定的后端。如果 Parse 决定提高他们的费用,您可以自由地搬到其他地方。