我正在研究从服务器(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
我不想为每个属性制作&lt; +&gt;,&lt; - &gt;,&lt;%&gt; ...因为它太复杂了,所以可能在收到&lt; %GT;字段,我只是删除具有指定ID的数据,然后再次添加(假设这里的id不是一些自动增加的字段)。
5)下载并更新所有内容后,我将更新“上次修改日期”字段。
此策略的主要问题是:如果我在更新某些内容时网络出现故障=&gt;上次修改日期尚未更新=&gt;下次我重新启动应用程序时,我将不得不再次执行相同的操作。更不用说潜在的不一致数据了。如果我使用临时表进行更新并使整个事件成为原子,那么它将起作用,但是如果更新太长(大量数据更改),则用户必须等待很长时间才能获得新数据。我应该为每个数据字段使用Last-Modified-Date并逐步更新数据吗?
答案 0 :(得分:2)
我首先要将更新例程设置为原子,因为您将有足够的资金来确定如何使客户端 - 服务器通信正常工作。
之后是考虑将其调整为增量的好时机,但只有在您进行一些测试以确定是否真的有必要之后。如果您将更新协议调整为尽可能低的带宽,您可能会发现即使是“大”更新也会以足够快的速度下载。
另一种看待它的方法是问问自己,当普通用户进行同步时,网络出现故障的频率是多少?您可能不希望针对不太可能的情况进行调整。
如果您正在尝试优化(最小化)数据传输,您可能需要考虑与XML不同的格式,因为XML相当冗长。或者至少你可能希望通过使每个元素名称和属性尽可能小来交换XML的可读性,并消除所有不必要的空格。
答案 1 :(得分:0)
你的基本方案很好。您需要做的是以某种方式使您的更新具有幂等性,以便您可以无风险地重新启动部分完成的传输。这是一种更好的方法,而不是尝试实现某种真正的原子提交(尽管你也可以这样做,使用例如SQLite数据库)。
根据我们的经验,如果服务器足够快,可以非常快速地下载相当大的更新(10s of KB)。不需要将更新分解成微小的位。但是,通过在“上次更新”中保留更详细的信息来尝试最小化传输的数据量肯定不会受到伤害。
(当然,您应该使用JSON而不是XML作为传输的数据表示。)
答案 2 :(得分:0)
不知道您是否考虑过使用Sync Framework来管理同步。如果您感兴趣,可以查看开源项目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