在 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 应用程序中同步数据的最佳策略的主要内容,如果未能解决你的问题,请参考以下文章