当应用有互联网连接时,将离线核心数据与服务器同步
Posted
技术标签:
【中文标题】当应用有互联网连接时,将离线核心数据与服务器同步【英文标题】:Sync offline core data with the server when app have internet connection 【发布时间】:2014-03-11 13:21:00 【问题描述】:我需要创建一个离线模块来存储我所有的请求,然后当互联网连接可用时,模块会一个一个地向服务器发出请求。
现在我正在使用 Core Data 和 AFNetworking 2.0,但我正在在线工作。所以接下来是在线算法:
-
创建请求
检查互联网连接
等待回复
根据 JSON 响应创建对象(数据库中的记录)
但离线算法有一点不同:
-
创建请求
检查互联网连接
创建代理对象(数据库记录)
收听互联网连接
与服务器同步临时数据。
临时对象后需要更新的主要事物唯一标识符和关系将与后端对象同步。
我的问题是已经有解决方案如何与服务器同步离线数据?
或者你有更好的算法对我来说也可以)
【问题讨论】:
【参考方案1】:我建议以下流程:
-
实现一个“请求管理器”,其中包含一个“私有队列”上下文
当某些模块需要发出请求时,它使用管理器来完成
当需要请求时,经理总是将其写入存储(使用其上下文)并带有创建日期的时间戳
管理员也会监听在线/离线状态变化
-
当检测到在线状态时,托管查询商店中未决的请求,并将它们一一发送到服务器
当需要新的请求时,管理器将按照 (4.1) 中的描述采取行动,以防止请求不足
您可以使用一个标志来指示管理器当前是否正在运行(处理请求),以便插入的新请求不会立即触发从存储中提取
发给服务器的请求可能有自己的上下文来写入存储,这样它们就不会干扰经理的工作
当检测到“离线”状态时,管理器可能会取消所有活动请求(它们将在下次检测到在线状态时执行
当请求完成时(提交到服务器和本地存储),它会从存储中删除
在激活管理器之前,您可以向商店查询待处理的请求并取消/删除不再相关的请求。
【讨论】:
谢谢,非常好的步骤。我认为它是完美的! ) 还有一个问题是 ID。所以每个对象都有现在正在服务器端创建的 ID。所以我认为可以在没有连接的情况下为我的对象创建一些离线ID,然后当请求成功时,我需要找到这个对象并重写它的属性。我说的对吗? 在本地创建对象时,您必须为它们提供一个临时 ID。当创建项目的“请求”提交给服务器时,您应该希望服务器回复包含新对象的永久 ID,否则您将不得不以某种方式获取该 ID。在最坏的情况下(当服务器不允许此类响应时),您可以在成功创建服务器后删除本地对象并让服务器通知您新创建的对象... 你能提供关于“请求管理器”的简要说明或一些演示吗? 当我用 Google 搜索时,我了解到一些使用 AFHTTPSessionManager 而不是 AFHTTPRequestOperationManager 对服务器进行离线请求的新方法,所以我现在应该怎么做我有点困惑。以上是关于当应用有互联网连接时,将离线核心数据与服务器同步的主要内容,如果未能解决你的问题,请参考以下文章