2

我知道这个问题之前已经提出过,但解释对我来说有点不清楚,我的问题有点笼统。我试图概念化如何使用远程 Web 服务定期更新 iPhone 应用程序中的数据。理论上,手机上的一部分数据会定期同步(仅在更新时)。而其他数据则需要用户在线,并在运行时被请求。

从概念上讲,这似乎可以使用 XML-RPC 或 JSON 和 Core 数据。我想知道是否有人对实现这一点的最佳方式有意见,我是一名 iPhone 开发新手,但我从概念上理解了大部分过程。

谢谢

4

3 回答 3

2

要在您无法控制服务器时同步一组实体,这是一种方法:

  1. touchedBOOL 属性添加到您的实体描述中。

  2. 在同步尝试中,将所有实体实例标记为未触及 ( touched = [NSNumber numberWithBool:NO])。

  3. 遍历您的服务器端 (JSON) 实例,并将实体从您的核心数据存储添加或更新到您的服务器端存储,反之亦然。更新的方向将取决于您的同步策略,以及任何一方的“更新”数据。无论哪种方式,将添加、更新或同步的 Core Data 实体标记为已触摸 ( touched = [NSNumber numberWithBool:YES])

  4. 根据您的同步策略,从您的 Core Data 存储中删除所有仍未触及的实体实例。未触及的实体可能已从您的服务器端存储中删除,因为在 Core Data 存储和这些对象的服务器之间没有发生任何添加、更新或同步事件。

同步是一项相当多的工作,取决于您需要支持的同步程度。如果您只是提取数据,则第 3 步要简单得多,因为您不需要将对象更新推送到服务器。

于 2010-07-02T05:43:13.033 回答
0

同步很难,很难。理想情况下,您希望从服务器接收更改的增量,然后为 Core Data 中的每条记录使用唯一的 id,只更新那些新的或更改的记录。

假设你能做到这一点,那么代码就很简单了。如果您在两个方向上同步,那么事情会变得更加复杂,因为您需要跟踪两侧的增量并处理冲突。

你能澄清一下你想要完成什么类型​​的同步吗?它是双向的还是仅拉动的?

于 2010-06-30T18:29:57.413 回答
0

我有一个答案,但它很糟糕。我目前正在寻找一种更可接受/更可靠的解决方案(即任何 Marcus Zarra 的做法)。

我所做的需要一些工作......说真的,因为它并不总是工作......

移动设备有一个实体的 json 目录、它们的版本,以及一个指向包含实体内容的 json 文件的 url。

服务器具有相同的设置、列出实体的目录等。

每当移动设备启动时,它都会将其本地目录的实体版本与服务器上的目录进行比较。如果服务器上的任何版本较新,它会为用户提供下载实体更新的机会。

当用户选择更新时,移动设备现在拥有每个新/更改实体的 url 并下载它。下载后,该应用程序将清除每个已更改实体的所有对象,然后从 JSON 中插入新对象。如果发生错误,删除/插入将回滚到更新前的状态。

这行得通,有点。当它出错时,我无法在调试会话中捕获它,所以我不确定是什么可能导致过程中的损坏或不一致。

于 2011-02-15T04:17:06.553 回答