我正在开发一个具有脱机功能的自动同步应用程序。用户将创建文件夹和文档,并可以与服务器同步。有一个自动同步功能,与服务器的同步将在后台每小时进行一次。在同步过程中,用户还可以创建、删除文件夹/文档。所有更改都保存在核心数据中。对于要发送到服务器的更改,我正在维护一个bool。如果bool为NO,则将这些项发送到服务器,一旦收到响应,将bool设置为YES。
现在,我的问题是如何确保在同步过程中所做的更改被发送到服务器。由于同步正在进行中,并且在此期间,如果我对已发送到服务器的项进行任何更改,即使同步bool设置为无更改,也将再次从服务器更新为YES,并且这些更改不会发送到服务器。
注意:在同步过程中,我不想对用户施加任何限制。
我怎样才能做到这一点?
发布于 2014-12-17 18:32:20
我来告诉你我们是怎么具体解决这个问题的。在我们的同步代码中,用户可以更改的任何给定对象上的任何属性都有一个相关的“脏标志”,这只是一个额外的布尔值,每当用户在主线程上下文中更改对象上的属性时(名称具有nameDirty等)。此布尔值是根据上下文预保存通知观察者自动设置的,它检查上下文的更改字典,并在适当情况下标记脏属性。
听起来像你的同步标志到目前为止,虽然你的是每个对象而不是每个属性。
对服务器的任何更改都不会被解析为任何将脏标志设置为YES的属性。类似地,每当将更改同步到服务器时,该标志将重置为NO,因此它将再次接受来自服务器的更改。
当用户对主上下文进行更改,而服务器同时在同步上下文(后台线程上)上解析更改时,会发生什么情况?这就是使用正确的NSMergePolicy的地方。主上下文有一个合并策略,它告诉内存中的更改比数据库中的任何内容都要重要。类似地,同步上下文有一个合并策略,告诉它让数据库中的任何值超过同步上下文中任何内存中的更改。(相同的预保存钩子还会戳出同步上下文,并告诉它同步对后台服务器的任何新更改。)这确保同步过程永远不会对用户刚才在主线程上所做的任何更改采取步骤,即使在SQLite级别的合并冲突中也是如此。
这里的关键是使用用户更改的上下文与在服务器更改中解析的上下文之间的上下文分离,因为这使我们能够非常清晰地对事情进行优先排序,并确保不会发生错误的合并。这两个上下文都直接绑定到持久存储协调器。
我正在写一篇关于同步框架是如何工作的博客文章,但是还没有完全完成,所以我还没有链接。
我知道有各种各样的第三方同步库,由于我们独特的要求,我们选择编写自己的,但我肯定会建议看看是否符合您的需要。
https://stackoverflow.com/questions/27519227
复制相似问题