iOS:在核心数据的背景下自动同步

我正在开发具有脱机function的自动同步应用程序。 用户将创build文件夹和文件,并可以与服务器同步。 有一个自动同步的function,在这个function中,服务器每隔一小时就会在后台进行同步。 在同步过程中,用户也可以创build,删除文件夹/文件。 所有更改都保存在核心数据中。 要更改发送到服务器,我维护一个布尔。 如果bool为NO,则将这些项目发送给服务器,一旦接收到响应,则将bool设置为YES。

现在我的问题是我如何确保在同步过程中所做的更改发送到服务器。 由于同步正在进行中,并在此期间,如果我做任何更改已发送到服务器的项目,即使同步布尔设置为无更改从服务器更新为是,这些更改将不会发送到服务器。

注意:我不想在同步过程中对用户进行任何限制。

我怎么能做到这一点?

我会告诉你我们如何具体解决这个问题。 在我们的同步代码中,用户可以更改的任何给定对象上的任何属性也都有一个关联的“脏标志”,只需要一个额外的布尔值,只要用户在主线程上下文中更改了对象的属性(name hasDirty等)。 这个布尔值是根据上下文预保存通知观察者自动设置的,该观察者检查上下文的变化字典并将属性标记为适当的。

听起来类似于你的同步标志到目前为止,虽然你是每个对象,而不是每个属性。

任何来自服务器的更改都不会被parsing为任何具有脏标志设置为YES的属性。 同样,每当更改同步到服务器时,该标志将重置为“否”,以便再次接受来自服务器的更改。

当用户在主要上下文中进行更改并且服务器同时在同步上下文(在后台线程上)更改时parsing会发生什么情况? 这就是使用正确的NSMergePolicy的地方。主要的上下文有一个合并策略,告诉它的内存中的变化胜过数据库中的任何东西。 同样,同步上下文有一个合并策略,告诉它让数据库中的任何值胜过同步上下文中的任何内存中的更改。 (相同的预保存钩子也会触发同步上下文,并告诉它在后台同步任何新的更改到服务器)。这确保了同步过程永远不会踩到用户在主线程上做出的任何更改,即使在一个SQLite级别的合并冲突。

这里的关键是在用户更改的上下文和服务器更改中parsing的上下文之间的上下文分离,因为这使得我们可以非常干净地确定事物的优先级,并确保不会发生错误的合并。 这两种情况都直接关系到持久性商店协调员。

我正在撰写有关我们的同步框架如何工作的博客文章,但尚未完成,所以我还没有链接。

我知道这里有各种各样的第三方同步库,而且由于我们独特的要求,我们select自己编写,但是我肯定会build议看看是否有任何适合您的需求。