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

7
我正在开发一个普通的iPhone应用程序,该应用程序从服务器(XML,JSON等)获取数据,我想知道实现同步数据的最佳方法是什么。标准包括速度(较少的网络数据交换),稳健性(更新失败时的数据恢复),离线访问和灵活性(当数据库结构略微更改时,如新列时适应)。我知道它因应用程序而异,但你们能分享一些策略/经验吗?
对于我来说,我考虑的是这样的:
1)在iPhone中存储上次修改日期
2)启动时发送消息,例如getNewData.php?lastModifiedDate=...
3)服务器将处理并仅从上次以来发送修改后的数据。
4)此数据格式如下: <+> //将其添加到SQLite/CoreData中 <-> //删除此项 <%>newValue //新的修改值
我不想为每个属性制作<+>、<- >、<%>……,因为这会太复杂,所以可能在接收到<%>字段时,我只需删除具有指定ID的数据,然后再次添加它(假设此处的ID不是自动递增的字段)。
5)一旦下载并更新了所有内容,我将更新“上次修改日期”字段。
这种策略的主要问题是:如果我在更新某些内容时网络中断=>上次修改日期尚未更新=>下次重新启动应用程序时,我将不得不再次进行相同的操作。更不用说潜在的不一致数据了。如果我为更新使用临时表并使整个过程原子化,它将起作用,但再次,如果更新太长(大量数据更改),用户必须等待很长时间,直到新数据可用。我应该为每个数据字段使用Last-Modified-Date并逐步更新数据吗?
3个回答

2

首先,我建议将更新例程设置为原子操作,因为你需要花费足够的精力来解决如何正确地进行客户端和服务器之间的通信。

在此之后,可以考虑调整为增量式更新,但前提是你需要进行一些测试来确定是否真的有必要这样做。如果你正在优化更新协议以尽可能降低带宽使用率,你可能会发现即使下载一个“大”更新也非常快速。

另一个考虑的方式是问自己,平均用户在同步时会遇到网络问题的频率有多高?你可能不想针对不太可能发生的情况进行优化。

如果你试图优化(减少)数据传输量,你可能需要考虑使用比XML更简洁的格式,因为XML相对冗长。或者至少你可以通过尽可能缩小每个元素名称和属性,并消除所有不必要的空格来交换XML可读性和空间。


0

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

  • 双向
  • 单向客户端
  • 单向设备
  • 启动

此外,所有修改都会自动跟踪并与云端同步。当网络连接断开时,您的应用程序可以离线运行。它将跟踪任何更改,并在连接恢复时自动在后台将其与云端同步。它还提供了类似iCloud的多设备同步功能。

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

在您的情况下,

Criteria are speed (less network data exchange), robustness (data recovery in case update fails), offline access
  • 速度:仅在网络上发送更改,双向同步

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

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

这是iPhone应用程序同步的链接:http://code.google.com/p/openmobster/wiki/iPhoneSyncApp


0

你的基本方案很好。你需要做的是以某种方式使你的更新幂等,这样你就可以在没有风险的情况下重新启动部分完成的传输。这比尝试实现某种真正的原子提交更好(虽然你也可以使用例如SQLite数据库来实现)。

根据我们的经验,如果服务器足够快,相当大的更新(10 KB左右)可以很快地下载。没有必要将更新分成小块。但肯定会尝试通过保留更粒度的“最后更新”信息来尽量减少数据传输量。

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


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