【问题标题】:iOS App Offline and synchronizationiOS App 离线与同步
【发布时间】:2013-07-27 05:16:13
【问题描述】:

我正在尝试在我的 iOS 应用程序中构建离线同步功能,并希望从社区获得一些反馈/建议,以了解执行相同操作时应遵循的策略和最佳实践。应用详情如下:

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

【问题讨论】:

    标签: ios caching sqlite


    【解决方案1】:

    今年年初我也做过类似的事情。在我阅读了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(当然还有更多好文章)。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-05-12
        • 2020-01-12
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多