我正在开发具有离线功能的自动同步应用程序。用户将创建文件夹和文档,并可以与服务器同步。有一种自动同步功能,其中每小时与后台服务器发生同步。在同步过程中,用户还可以创建,删除文件夹/文档。所有更改都保存在核心数据中。要将更改发送到服务器,我维持一个bool。如果bool为NO,则将这些项发送到服务器,一旦收到响应,将bool设置为YES。
现在我的问题是如何确保在同步过程中完成的更改正在发送到服务器。由于同步正在进行中,如果我对已发送到服务器的项目进行任何更改,即使同步bool设置为NO,服务器的更改也会再次更新为YES,并且这些更改将不会发送到服务器。
注意:在同步过程中,我不想对用户进行任何限制。
我怎样才能实现这个目标?
答案 0 :(得分:1)
我会告诉你我们是如何具体解决这个问题的。在我们的同步代码中,用户可以更改的任何给定对象上的任何属性也都有一个关联的“脏标志”,只是一个额外的布尔值,只要用户更改主线程中对象的属性就会设置该布尔值。 context(name有nameDirty等)。此布尔值基于上下文预保存通知观察器自动设置,该观察器检查上下文的更改字典并在适当时将属性标记为脏。
到目前为止,听起来与你的同步标志类似,不过你的是每个对象而不是每个属性。
服务器的任何更改都不会被解析为脏标志设置为YES的任何属性。同样,每当更改同步到服务器时,该标志将重置为NO,以便它再次接受来自服务器的更改。
当用户对主上下文进行更改并且服务器同时解析同步上下文(在后台线程上)时会发生什么?这就是使用正确的NSMergePolicy的地方。主要的上下文有一个合并策略,告诉它在内存中的变化,以胜过数据库中的任何东西。类似地,同步上下文有一个合并策略,告诉它让数据库中的任何值胜过同步上下文中的任何内存中更改。 (相同的预保存挂钩也会调用同步上下文并告诉它在后台同步服务器的任何新更改。)这可以确保同步过程永远不会踩到用户刚在主线程上进行的任何更改,即使在SQLite级合并冲突。
这里的关键是用户更改的上下文与服务器更改中解析的上下文之间的上下文分离,因为这样可以非常干净地确定事物的优先级,并确保永远不会发生错误的合并。两个上下文都直接绑定到持久性存储协调器。
我正在撰写关于我们的同步框架如何运作的博客文章,但它还没有完成,所以我还没有链接。
我知道有各种第三方同步库,由于我们的独特要求,我们选择自己编写,但我绝对建议您查看是否符合您的需求。