我知道这个问题之前已经提出过,但解释对我来说有点不清楚,我的问题有点笼统。我试图概念化如何使用远程 Web 服务定期更新 iPhone 应用程序中的数据。理论上,手机上的一部分数据会定期同步(仅在更新时)。而其他数据则需要用户在线,并在运行时被请求。
从概念上讲,这似乎可以使用 XML-RPC 或 JSON 和 Core 数据。我想知道是否有人对实现这一点的最佳方式有意见,我是一名 iPhone 开发新手,但我从概念上理解了大部分过程。
谢谢
我知道这个问题之前已经提出过,但解释对我来说有点不清楚,我的问题有点笼统。我试图概念化如何使用远程 Web 服务定期更新 iPhone 应用程序中的数据。理论上,手机上的一部分数据会定期同步(仅在更新时)。而其他数据则需要用户在线,并在运行时被请求。
从概念上讲,这似乎可以使用 XML-RPC 或 JSON 和 Core 数据。我想知道是否有人对实现这一点的最佳方式有意见,我是一名 iPhone 开发新手,但我从概念上理解了大部分过程。
谢谢
要在您无法控制服务器时同步一组实体,这是一种方法:
将touched
BOOL 属性添加到您的实体描述中。
在同步尝试中,将所有实体实例标记为未触及 ( touched = [NSNumber numberWithBool:NO]
)。
遍历您的服务器端 (JSON) 实例,并将实体从您的核心数据存储添加或更新到您的服务器端存储,反之亦然。更新的方向将取决于您的同步策略,以及任何一方的“更新”数据。无论哪种方式,将添加、更新或同步的 Core Data 实体标记为已触摸 ( touched = [NSNumber numberWithBool:YES]
)
根据您的同步策略,从您的 Core Data 存储中删除所有仍未触及的实体实例。未触及的实体可能已从您的服务器端存储中删除,因为在 Core Data 存储和这些对象的服务器之间没有发生任何添加、更新或同步事件。
同步是一项相当多的工作,取决于您需要支持的同步程度。如果您只是提取数据,则第 3 步要简单得多,因为您不需要将对象更新推送到服务器。
同步很难,很难。理想情况下,您希望从服务器接收更改的增量,然后为 Core Data 中的每条记录使用唯一的 id,只更新那些新的或更改的记录。
假设你能做到这一点,那么代码就很简单了。如果您在两个方向上同步,那么事情会变得更加复杂,因为您需要跟踪两侧的增量并处理冲突。
你能澄清一下你想要完成什么类型的同步吗?它是双向的还是仅拉动的?
我有一个答案,但它很糟糕。我目前正在寻找一种更可接受/更可靠的解决方案(即任何 Marcus Zarra 的做法)。
我所做的需要一些工作......说真的,因为它并不总是工作......
移动设备有一个实体的 json 目录、它们的版本,以及一个指向包含实体内容的 json 文件的 url。
服务器具有相同的设置、列出实体的目录等。
每当移动设备启动时,它都会将其本地目录的实体版本与服务器上的目录进行比较。如果服务器上的任何版本较新,它会为用户提供下载实体更新的机会。
当用户选择更新时,移动设备现在拥有每个新/更改实体的 url 并下载它。下载后,该应用程序将清除每个已更改实体的所有对象,然后从 JSON 中插入新对象。如果发生错误,删除/插入将回滚到更新前的状态。
这行得通,有点。当它出错时,我无法在调试会话中捕获它,所以我不确定是什么可能导致过程中的损坏或不一致。