iOS应用程序的离线和同步

6

我正在尝试在我的iOS应用中构建离线同步功能,希望能从社区中获得一些反馈和建议,以制定相应的策略和最佳实践。该应用程序的详细信息如下:

该应用向用户展示数字目录,并允许他们执行创建和下单等操作。目前该应用只能在联网的情况下使用,我们为所有操作(例如查看目录、创建/下单)提供返回JSON数据的API。

我们希望为用户提供离线/同步功能,使用户可以在离线状态下查看目录和创建/下单,当他们重新联网时,订单详情将被同步并更新到我们的服务器上。我们还想从服务器拉取最新的数据,以便在应用离线期间发生目录更改或订单更改时,应用可以保持最新状态。

你们能否帮助我设计和处理此类功能的最佳方法和途径呢?

2个回答

6
我在今年年初做过类似的事情。在阅读了NSOperationQueue和NSOperation之后,我采取了一种直接的方法:
每当我的本地数据库中的对象被更改/添加/...时,我就会向队列中添加一个新的“同步”操作,并且我不关心应用程序是在线还是离线(我添加了一个可达性观察者,它可以暂停队列或将其恢复工作;当然,如果发生错误(在同步期间丢失网络),我会重新排队)。操作本身读取/写入数据库并执行网络操作。我的ViewController使用NSFetchedResultsController(带有delegate=self)来获取有关更改的回调。在某些情况下,我需要一些额外的本地数据(涉及计数对象),我使用了NSManagedObjectContextObjectsDidChangeNotification。
此外,我使用了多上下文CoreData,这听起来很合理(我只有两个上下文)。
要从服务器获得有关更改的通知,我相信iOS 7为您提供了一些新功能。
在服务器端,您应该阅读一些关于实际方法的内容,以便选择适合您的方式:例如,Dan Grover的数据同步开发Android REST客户端应用程序(当然还有很多其他好的文章)。

2
注意:当您期望获得简单的解决方案时,可能会感到失望。您的需求并不罕见,但解决方案可能会比您预期的更加复杂 - 这取决于“业务规则”和其他合理要求。如果您智能地限制您的需求,您可能会找到一个可以自己实现的解决方案,否则您也可以考虑使用商业产品。
我可以想象,如果您设计业务逻辑以考虑离线状态并在业务逻辑中明确地公开此状态,您可能会找到一个可以用适度的努力自己实现的解决方案。我的意思是,例如,当用户创建订单时,它最初处于“未提交”状态。只有在有服务器访问权限并且服务器确认此用户可以实际下订单时,该订单才会被提交。服务器还可以拒绝订单,并向用户发送相应的消息。
由于eventual consistency的要求,可能会出现一些微妙的问题。
请参阅此问题,其中包含来自商业产品的解决方案指针,如果您访问它们的网站,则可以获得有关问题复杂性以及如何解决问题的有价值信息。

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