应用有网络连接时,将离线核心数据与服务器同步

6

我需要创建一个离线模块,它将存储所有我的请求,当网络连接可用时,该模块将逐个向服务器发出请求。

目前我正在使用Core Data和AFNetworking 2.0工作,但我是在线的。因此,在线算法如下:

  1. 创建请求
  2. 检查互联网连接
  3. 等待响应
  4. 根据JSON响应创建对象(在数据库中记录)

但离线算法有所不同:

  1. 创建请求
  2. 检查互联网连接
  3. 创建代理对象(在数据库中记录)
  4. 监听互联网连接
  5. 将临时数据与服务器同步。

主要问题是唯一标识符和关系,需要在将临时对象与后端对象同步后进行更新。

我的问题是是否已经有了解决离线数据与服务器同步的解决方案?

或者您是否有更好的算法,这对我也可以)

1个回答

11
我建议按照以下流程操作:
  1. 实现一个“请求管理器”,它内部有一个“私有队列”上下文
  2. 当某个模块需要发出请求时,使用管理器进行操作
  3. 当需要请求时,管理器始终使用创建日期的时间戳将其写入存储(使用其上下文)
  4. 管理器还将侦听在线/离线状态更改
    1. 检测到在线状态时,管理器会查询待处理请求的存储并逐个将其发送到服务器
    2. 需要新请求时,管理器将按照(4.1)中所述进行操作以防止请求饥饿
    3. 您可以使用标志指示管理器当前是否正在运行(处理请求),以便插入新请求时不会立即从存储中触发提取
    4. 发送到服务器的请求可能具有自己的上下文以写入存储,以便它们不会干扰管理器的工作
    5. 检测到“离线”状态时,管理器可以取消所有活动请求(它们将在下一次检测到在线状态时执行)
    6. 完成请求(提交到服务器和本地存储)后,将从存储中删除该请求

在激活管理器之前,您可以查询存储以获取待处理请求,并取消/删除不再相关的请求。


谢谢,非常好的步骤。我认为这很完美!)还有一个问题是ID。所以每个对象都有一个ID,现在在服务器端创建。因此,我认为为我的对象创建一些离线ID并没有连接也是可以的,然后当请求成功时,我需要找到这个对象并重写它的属性。我是正确的吗? - Matrosov Oleksandr
当本地创建对象时,必须为它们提供临时ID。当提交“请求”以创建该项时,您应该希望服务器的回复将包含新对象的永久ID,否则您将不得不以某种方式获取该ID。在最坏的情况下(当服务器不允许此类响应时),您可以在成功创建服务器后删除本地对象,并让服务器通知您有一个新创建的对象... - Dan Shelly
1
你能提供一下“请求管理器”的简要描述或者演示吗? - Darshan Mothreja
当我谷歌搜索时,我发现使用AFHTTPSessionManager而不是AFHTTPRequestOperationManager进行离线请求的新方法,那么现在我应该怎么做呢?我有点困惑。 - Darshan Mothreja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接