在 iPhone 应用程序中同步数据的最佳策略

Posted

技术标签:

【中文标题】在 iPhone 应用程序中同步数据的最佳策略【英文标题】:Best strategy for synching data in iPhone app 【发布时间】:2010-06-06 15:02:49 【问题描述】:

我正在开发一个从服务器(XML、JSON 等)提取数据的常规 iPhone 应用程序,我想知道实现同步数据的最佳方式是什么。标准是速度(较少的网络数据交换)、健壮性(更新失败时的数据恢复)、离线访问和灵活性(当数据库结构发生轻微变化时的适应性,如新列)。我知道它因应用程序而异,但你们能分享一些您的策略/经验吗?

对于我来说,我正在考虑这样的事情:

1) 在 iPhone 中存储上次修改日期

2) 启动后,发送一条消息,如 getNewData.php?lastModifiedDate=...

3) 服务器将只处理和发回上次修改的数据。

4) 该数据的格式如下:

<+><data id="..."></data></+> // add this to SQLite/CoreData

<-><data id="..."></data></-> // remove this

<%><data id="..."><attribute>newValue</attribute></data></%> // new modified value

我不想为每个属性都设置、、...,因为它太复杂了,所以可能当收到一个字段时,我只会删除指定 id 的数据,然后重新添加(假设这里的 id 不是自动自增的字段)。

5) 下载并更新所有内容后,我将更新 Last Modified Date 字段。

这种策略的主要问题是:如果我在更新某些东西时网络出现故障 => 上次修改日期尚未更新 => 下次我重新启动应用程序时,我将不得不再次经历同样的事情.更不用说潜在的不一致数据了。如果我使用临时表进行更新并使整个事情原子化,它会起作用,但同样,如果更新时间太长(大量数据更改),用户必须等待很长时间才能获得新数据。我应该对每个数据字段使用 Last-Modified-Date 并逐步更新数据吗?

【问题讨论】:

【参考方案1】:

我将从使更新例程原子化开始,因为您将有足够的时间来弄清楚如何使客户端-服务器通信正常工作。

之后是考虑将其调整为增量的好时机,但只有在您进行一些测试以确定是否真的有必要之后。如果您将更新协议调整为尽可能低的带宽,您可能会发现即使是“大”更新的下载速度也足够快。

另一种看待它的方式是问问自己,当普通用户进行同步时,网络问题多久会出现一次?您可能不想针对不太可能的情况进行调整。

如果您尝试优化(最小化)数据传输,您可能需要考虑与 XML 不同的格式,因为 XML 相当冗长。或者至少您可能希望通过使每个元素名称和属性尽可能小来以 XML 可读性换取空间,并消除所有不必要的空格。

【讨论】:

【参考方案2】:

你的基本方案很好。您需要做的事情是以某种方式使您的更新具有幂等性,以便您可以重新启动部分完成的传输而没有风险。这是比尝试实现某种真正的原子提交更好的方法(尽管您也可以这样做,例如使用 SQLite 数据库)。

根据我们的经验,如果服务器速度足够快,可以非常快速地下载相当大的更新(10 KB)。没有必要将更新分解成微小的部分。但是,通过在“上次更新”上保留更详细的信息来尽量减少传输的数据量当然不会有什么坏处。

(当然你应该使用 JSON 而不是 XML 作为你传输的数据表示。)

【讨论】:

【参考方案3】:

想知道您是否考虑过使用同步框架来管理同步。如果您对此感兴趣,可以查看开源项目 OpenMobster 的 Sync 服务。您可以进行以下同步操作

双向 单向客户端 单向装置 启动

除此之外,所有修改都会自动跟踪并与云端同步。当网络连接中断时,您可以让您的应用程序离线。它将跟踪任何更改,并在连接返回时自动在后台将其与云同步。它还提供跨多个设备的同步,例如 iCloud

此外,云中的修改使用推送通知进行同步,因此即使数据存储在本地,数据也始终是最新的。

在你的情况下,

Criteria are speed (less network data exchange), robustness (data recovery in case update fails), offline access

速度:只有更改通过网络双向发送

稳健性:它将数据存储在诸如 sqlite 之类的事务存储中,并且任何失败的更新都会在 SyncML 有效负载中进行通信。只有成功的操作才会被处理,失败的操作会在下次同步时重试

这里是开源项目的链接:http://openmobster.googlecode.com

这里是 iPhone App Sync 的链接:http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

【讨论】:

以上是关于在 iPhone 应用程序中同步数据的最佳策略的主要内容,如果未能解决你的问题,请参考以下文章

客户端 - 服务器数据同步策略[Java]

Apple Watch 与 iPhone 通信的最佳方式是啥? [关闭]

在 iPhone 应用程序中处理离线存储的最佳方式?

存储 iPad/iPhone 应用程序数据的最佳方式

如何在 iPhone 和另一台计算机之间同步应用程序数据?

将本地 HTML5 DB(WebSQL 存储,SQLite)与服务器同步的最佳方法(2 路同步)[关闭]