【问题标题】:iOS: Auto-Sync in background with core dataiOS:在后台与核心数据自动同步
【发布时间】:2014-12-18 02:32:20
【问题描述】:

我正在开发一个具有离线功能的自动同步应用程序。用户将创建文件夹和文档,并可以与服务器同步。有一个自动同步的功能,其中与服务器的同步将在后台每小时发生一次。在同步过程中,用户还可以创建、删除文件夹/文档。所有更改都保存在核心数据中。对于要发送到服务器的更改,我正在维护一个布尔值。如果 bool 为 NO,则将这些项目发送到服务器,一旦收到响应,将 bool 设置为 YES。

现在我的问题是如何确保在同步过程中完成的更改被发送到服务器。由于同步正在进行中,并且在此期间,如果我对已发送到服务器的项目进行任何更改,即使同步布尔设置为 NO,服务器的更改也会再次更新为 YES,并且这些更改不会发送到服务器。

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

我怎样才能做到这一点?

【问题讨论】:

  • 为此添加特殊属性是个坏主意。您应该将更改集存储在其他地方。另外,我建议您使用Ensembles 进行同步。
  • 为什么要将特殊属性存储在数据库之外?这样你就失去了保存原子性,冒着两者之间破裂的风险......

标签: ios core-data


【解决方案1】:

我会告诉你我们是如何具体解决这个问题的。在我们的同步代码中,用户可以更改的任何给定对象上的任何属性也都有一个关联的“脏标志”,只是一个附加的布尔值,每当用户更改主线程上下文中对象的属性时就会设置它(名称有 nameDirty , ETC。)。这个布尔值是根据上下文预保存通知观察器自动设置的,它检查上下文的更改字典并根据需要将属性标记为脏。

到目前为止,听起来与您的同步标志相似,但您的同步标志是按对象而不是按属性。

来自服务器的任何更改都不会被解析为任何将脏标志设置为 YES 的属性。同样,每当更改同步到服务器时,该标志都会重置为 NO,因此它将再次接受来自服务器的更改。

当用户对主上下文进行更改并且服务器同时解析同步上下文(在后台线程上)的更改时会发生什么?这就是使用正确的 NSMergePolicy 的地方。主上下文有一个合并策略,告诉它在内存中的更改胜过数据库中的任何内容。类似地,同步上下文有一个合并策略,告诉它让数据库中的任何值胜过同步上下文中的任何内存更改。 (同样的 pre-save 钩子还戳同步上下文并告诉它在后台同步任何新的更改到服务器。)这确保同步过程永远不会踩到用户刚刚在主线程上所做的任何更改,即使在SQLite 级别的合并冲突。

这里的关键是接受用户更改的上下文和解析服务器更改的上下文之间的上下文分离,因为这使我们能够非常清晰地确定事物的优先级并确保永远不会发生错误的合并。这两个上下文都直接与持久存储协调器相关联。

我正在写一篇关于我们的同步框架如何工作的博文,但还没有完成,所以我还没有链接。

我知道那里有各种第三方同步库,由于我们的独特要求,我们选择编写自己的同步库,但我肯定会建议看看是否有开箱即用的适合您的需求。

【讨论】:

  • 您的博客完成了吗?如果有,请分享链接。
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 2019-09-29
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多