6

我正在尝试在我的 iOS 应用程序中构建离线同步功能,并希望从社区获得一些关于策略和最佳实践的反馈/建议。应用详情如下:

该应用程序向用户显示数字目录,并允许他们执行创建和下订单等操作。目前,该应用程序仅在在线时有效,我们为所有操作提供 API,例如查看目录、创建/下订单返回 JSON 数据。我们希望为用户提供离线/同步功能,通过它用户可以在离线时查看目录并创建/下订单,当他们上线时,订单详细信息将同步并更新到我们的服务器。我们还希望从服务器中提取最新数据,并让应用程序保持最新状态,以防应用程序离线时服务器发生目录更改或订单更改。你们能帮我找到处理这种功能的最佳设计和方法吗?

4

2 回答 2

6

今年年初我也做过类似的事情。在我阅读了NSOperationQueue 和 NSOperation之后,我做了一个直截了当的方法:

每当在我的本地数据库中更改/添加/...时,我都会向队列中添加一个新的“同步”操作,并且我不关心应用程序是在线还是离线(我添加了一个可达性观察器,它要么暂停队列或使其恢复工作;当然,如果发生错误,我会重新排队(同步期间丢失网络))。该操作本身读取/写入数据库并执行网络操作。我的 ViewController 使用 NSFetchedResultsController (with delegate=self) 来获取更改的回调。在某些情况下,我需要一些额外的本地数据(它是关于计数对象),其中我使用了 NSManagedObjectContextObjectsDidChangeNotification。

此外,我使用了听起来很合理的Multi-Context CoreData(我只有两个上下文)。

为了从您的服务器获得有关更改的通知,我相信 iOS 7 为您提供了一些新的东西。

在服务器端,您应该阅读一些您想要采用的实际方法:即 Dan Grover 的数据同步开发 Android REST 客户端应用程序(当然还有更多好的文章)。

于 2013-07-26T21:09:55.070 回答
2

注意:当您期望一个简单的解决方案时,您可能会感到失望。您的要求并不少见,但解决方案可能会比您预期的更复杂 - 取决于“业务规则”和其他合理要求。如果您明智地限制您的要求,您可能会找到可以自己实施的解决方案,否则您也可以考虑使用商业产品。

我可以想象,如果您将业务逻辑设计为考虑到离线状态并在业务逻辑中显式公开这一点,您可能会找到一个您可以通过适度的努力自己实现的解决方案。我的意思是,例如,当用户创建订单时,它最初处于“未提交”状态。只有当可以访问服务器并且服务器给出“OK”表明该用户实际上可以下订单时,才会提交订单。服务器也可以拒绝订单,向用户发送相应的消息。

由于最终一致性的要求,可能会出现很多微妙的问题。

另请参阅此问题,其中包含指向商业产品解决方案的指针,如果您访问他们的网站,请提供有关问题复杂性以及如何解决问题的有价值信息。

于 2013-07-26T21:16:13.610 回答