iOS App离线和同步

时间:2013-07-26 19:15:59

标签: ios caching sqlite

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

要获得有关服务器更改的通知,我相信iOS 7会为您提供新功能。

在服务器端,您应该阅读一些您想要的实际方法:i.e. Data Synchronization by Dan GroverDeveloping Android REST Client Applications(当然还有更多好文章)。

答案 1 :(得分:1)

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

我可以想象,如果您将业务逻辑设计为考虑脱机状态并在业务逻辑中明确公开,您可以找到一个可以自己轻松实现的解决方案。我的意思是,例如,当用户创建订单时,它最初处于“未提交”状态。只有当有权访问服务器并且服务器给出“OK”时,才会提交订单,该订单实际上可以由该用户放置。服务器也可以拒绝订单,向用户发送相应的消息。

由于eventual consistency的要求,可能会出现一些微妙的问题。

另请参阅此question,其中包含指向商业产品解决方案的链接,如果您访问其网站,则会提供有关问题复杂性以及如何解决此问题的宝贵信息。