TICoreDataSync 1.0.2

TICoreDataSync 1.0.2

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014 年 12 月

未认领 维护。



 
依赖
Dropbox-iOS-SDK~> 1.3.3
Dropbox-OSX-SDK~> 1.3.3
 

  • Tim Isted、Michael Fey、Kevin Hoctor、Christian Beer、Tony Arnold 和 Danny Greg 创建

Mac OS X 和 iOS 之间 Core Data 应用(包括基于文档的应用)的自动同步,可在任一组合中进行:Mac 至 iPhone 至 iPad 至 iPod touch 及反向同步

原创设计和实现:Tim Isted (@timisted) 和 Michael Fey (@MrRooni)

跳转到 最近更改列表

许可证

TICoreDataSync 基于 (MIT 许可证) 许可。

摘要

TICoreDataSync 是一系列类,可使用云同步(包括 Dropbox)在 Mac OS X 或 iOS 上的任意多个客户端之间为基于 Core Data 的应用程序(包括基于文档的应用程序)提供同步服务。如果需要通过未支持的功能同步,则非常易于扩展。

需求

TICoreDataSync 在 Mac OS X 10.7 或更高版本和 iOS 5.1 或更高版本上运行。

为了同步,您的模型对象必须继承自 TICDSSynchronizedManagedObject,并有一个名为 ticdsSyncID 的额外字符串属性,该属性用于在多个客户端之间跟踪对象。所有要同步的模型对象更改必须在标记为 synchronizedNSManagedObjectContext 中进行。

在实践中,这意味着将您 .xcdatamodel 中的任何 NSManagedObject 使用更改为 TICDSSynchronizedManagedObject,将任何自定义 NSManagedObject 子类更改为继承自 TICDSSynchronizedManagedObject,以及在构建 Core Data 堆栈时将主 NSManagedObjectContext 标记为 synchronized。因为 TICoreDataSync 包含自己的 .xcdatamodel,所以您不能通过合并包中的所有模型来构建堆栈,您需要直接指定数据模型文件。

您的应用程序需要跟踪一个 TICDSApplicationSyncManager 实例,用于在应用程序中使用的同步类型,并且在执行其他任务之前必须 注册 此同步管理器。如果您的应用程序不是基于文档的,则您需要一个单独的 TICDSDocumentSyncManager 实例来处理应用程序数据的同步。如果您有一个基于文档的应用程序,则需要每个文档一个 TICDSDocumentSyncManager。同样,在可以使用之前必须注册文档同步管理器。

文档

框架的文档可以在以下位置找到:
http://nothirst.github.io/TICoreDataSync

这包括框架的概述MaciOS教程、有关扩展框架的信息,以及包括完整的类参考和一些说明每个底层操作类执行的任务的图表

Xcode Docset

该框架包含一个Xcode docset,其中包含所有TICoreDataSync类和协议的文档。对每个头文件进行标记,以便通过appledoc生成docset。

如果您已安装appledoc,可以自己构建它,通过在仓库根目录中执行appledoc .来生成docset。

您可以选择安装docset或在线阅读其内容
http://nothirst.github.io/TICoreDataSync/

请注意,docset中操作顶部的信息已过时;请参阅类图表以了解确切发生的情况。

示例应用

该仓库包括几个Xcode项目,演示了在Mac和iOS应用中如何使用该框架。有两个主要应用,非基于文档的iOS和Mac笔记本。

示例应用指南详细解释了这些如何工作。

工作原理

当主托管对象上下文保存时,框架开始行动,执行以下任务

  1. 为任何修改对象的每个更改(插入、删除、属性更改和关系更改)创建同步更改对象(TICDSSyncChange)。这由TICDSSynchronizedManagedObject类处理。

  2. 这些更改保存在私有上下文/存储中,并内部处理。

文档同步管理器将在每次托管对象上下文保存后立即询问您是否要启动同步,或者您可以手动启动同步。

同步过程包括以下内容

  1. 文档同步管理器创建一个同步操作,首先下载尚未应用的所有同步更改集。

  2. 同步操作按日期顺序遍历每个更改集,并在后台托管对象上下文中应用其更改(这是您的应用程序主要MOC的子上下文)。

  3. 如果遇到冲突,它通知TICDSDocumentSyncManagerDelegate协议,该协议负责决定本地更改还是远程同步更改具有优先权(请参阅下面的冲突和警告部分)。

  4. 后台上下文被保存,由于它是应用程序上下文的子上下文,所有更改都将自动合并到主上下文中。框架将通过TICDSDocumentSyncManagerDelegate方法提醒您。

  5. 一旦所有远程同步更改都已应用,将推送本地同步更改集。

  6. 将文件(以客户端设备的UID命名)保存在RecentSyncs目录中,以表示文档上次同步的时间。

如果未检查,与同步相关的文件将无限期地留在远程位置。您的应用程序应要求文档同步管理器每隔一段时间自行清理,例如在注册时,或每天/每周等。真空过程将检查哪个客户端最近同步的时间最短(RecentSyncs目录中最老的文件),然后删除所有比这个日期旧的相关同步文件--每个客户端设备都负责清理它创建的文件。不要在每个同步后启动真空,否则可能会陷入无限循环的风险。

同步管理器类型

您不得直接实例化TICDSApplicationSyncManagerTICDSDocumentSyncManager类之一,而应使用与您需要的方法同步的特定子类。

框架包含一组基于文件管理器的同步类,用于与可以使用NSFileManager访问的任何内容进行同步,包括桌面Dropbox或网络驱动器。尽管这些类实际上访问的是一个“本地”卷,但它们永远不会让Core Data直接与存储“远程”的文件进行通信。

无论同步类型如何,框架都会在处理文件之前将其下载到本地辅助文件目录(位置可以通过代理回调进行自定义)中,然后再上传到远程位置。永远不会在远程存储中直接编辑文件。

加密

由于框架仅与本地文件一起工作,而不是远程访问文件,因此框架包括可选的加密。您需要做的一切是提供密码以响应两个与加密相关的TICDSApplicationSyncManagerDelegate方法。

如果启用了加密,框架使用的每个文件都将加密,但AppliedSyncChangeSets文件除外,因为这些文件只包含UUID字符串和日期。

冲突和警告

同步过程是一个“滚动同步”。每个客户端负责解决以前客户端推送的同步更改之间的冲突,以及它想要推送的同步更改。

目前,您可以选择解决的唯一冲突是,如果同一个对象在本地和远程修改了相同的属性,但属性值不同(如果更改的值相同,则“冲突”会自动解决)。您将通过TICDSDocumentSyncManagerDelegate方法得知;您必须决定本地更改还是远程更改具有优先权,然后调用文档同步管理器以便它可以继续同步。

如果在同步过程中发生以下问题,您将在过程结束后收到一个警告数组以进行提示

  • 一个对象已经在本地被更改,但在上一个远程客户端同步中已被删除--该对象将被删除。

  • 一个对象已在本地被删除,但以前客户端同步中有变更尚未在本地应用--该对象将被删除。

在此阶段,该框架无法提供解决这两类冲突的功能,而只是提供同步后的警告。在将来的版本中可能会发生变化,但需要一些思考。考虑一个具有大量相互关联对象的数据模型:根据级联规则,如果在远程对象已更改而本地已删除时检测到冲突,不仅需要在本地“恢复”对象,还需要遍历其所有关系以撤销级联删除。同样,如果本地更改的对象已被其他客户端删除,则框架需要生成插入同步更改,不仅针对对象本身,还包括所有相关的“级联”对象,以及相关物体的相关物体,等等。

底层操作

目前由同步管理器产生了11种主要类型操作。

这些都是通用类,设计为被覆盖以添加所需的上传/下载行为。例如,如果您使用TICDSFileManagerBasedDocumentSyncManager,它将产生自己的TICDSFileManagerBasedXXXOperation对象,并正确配置它们。

所有操作都是(采用苹果的术语)并发操作,可以在主线程上运行,例如,用于异步URL的下载上传(除了与非传输相关的其他工作仍在后台执行),或者在完全在后台运行,例如文件管理器基于的传输。

有关每个操作执行的任务信息,请参阅操作图解

扩展

您可以为任何特定的基于云的同步选项创建一组自己的类。您需要继承应用和文档同步管理器,以及所有必要的操作。您的TICDSApplicationSyncManagerTICDSDocumentSyncManager子类,以及每个操作子类,必须覆盖某些方法以执行相关任务 — 请参阅扩展框架指南以获得更多信息。

远程文件结构

TICoreDataSync使用大量文件进行同步,并将这些文件存储在远程位置,方式如下:远程文件层次结构文档所述。

待办事项

目前,TICoreDataSync只支持基于文件管理器的同步和DropboxSDK同步。iCloud同步正在功能分支中实现。

目前尚无自动功能从远程服务中删除整个同步数据目录,也无法删除客户端文件的整个应用程序的同步。这些任务将很快添加。

近期更改

  • 2013-05-13

    • 框架的1.0.2版本已发布,包含许多可靠性增强。
    • TICDS在从其他客户端消耗更改时现在有一个检查系统,以确保这些更改确实已保存到磁盘。
    • 现在框架现在在收到NSManagedObjectContextWillSaveNotification而不是NSManagedObjectContextDidSaveNotification通知时创建传出更改。
    • 文档已完全迁移到项目Wiki,并将从现在起在那里维护。
    • 框架现在在上传和下载期间支持对整个存储文件进行压缩。
  • 2013-01-23

    TICDSSynchronizedManagedObjectContext类不再存在,已被NSManagedObjectContext的类别所取代。

  • 2012年10月29日

    自4月份以来,框架经历了一些重大变化,包括:

    • 框架现在使用NSPrivateQueueConcurencyType为后台托管对象上下文应用同步更改。因此,您的应用程序必须提供实例化的托管对象上下文为NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType
    • 由于新的MOC并发类型,项目现在具有最低部署版本为OS X 10.7和iOS 5.1。
    • 框架现在提供了Mac和iOS的静态库。您的项目现在应将静态库项目作为依赖项包含,而不是直接将TICDS文件添加到项目中。
  • 2012年4月26日

    主要由于MrRooni不愿使文档与当前开发状态保持一致,有时文档可能与实现滞后。如果您发现这种情况,请对此提出问题,或者最好自行纠正。

  • 2011年7月31日

    该文档同步管理器现在会检查完整性键。这些键在同步的每个文档中保留在用户默认值中。在注册时,完整性键与远程的键进行检查;如果它不匹配,会警告委托重新下载存储库,并由文档同步管理器自动清理任何与本地同步相关的文件。

    请注意,任何现有的远程数据都需要删除。

  • 2011年7月21日

    应用程序和文档同步管理器都提供了延迟注册过程的能力。在网络环境不佳的情况下,例如iOS设备,您可能只想配置应用程序和文档同步管理器以跟踪更改,并允许用户使用应用程序。一旦他们要求同步,检查您是否已注册,如果没有,则在同步之前进行注册。

    有关更多信息,请参阅TICDSApplicationSyncManagerTICDSDocumentSyncManager引用。

  • 2011年6月6日

    现在可以删除客户数据,以便与文档同步 - 请参阅TICDSDocumentClientDeletionOperation,以及文档同步管理器的deleteDocumentSynchronizationDataForClientWithIdentifier:方法。