3

我认为这是一种非常常见的情况,但由于我是 iOS 编程的新手,我不确定最佳的编码方式。

概要:

我在服务器上有数据,iPhone 应用程序可以通过 REST 服务检索这些数据。在服务器端,数据是具有外键(整数 id 号)的对象。

我将通过 REST 检索到的数据存储在 Core Data 中。托管对象具有“objId”属性,以便我可以在其余代码中唯一标识托管对象。

我的应用程序必须始终反映服务器数据。

在向服务器发出的后续请求中:

  • 有些对象可能不会返回,它们已在服务器上被删除——在这种情况下,我需要从 Core Data 中删除相应的对象——这样我才能正确反映服务器的状态。

  • 一些对象的属性发生了变化,因此相应的托管对象需要用新数据进行更新。

我的解决方案 - 并向您提问

为了在我的应用程序中运行,我做了最简单的解决方案,删除 Core Data 中的所有对象,然后添加所有新对象,使用最新的服务器端数据创建。

我不认为这是处理它的最佳方法:) 随着我的应用程序的进展,我现在想将我的 tableview 与 NSFetchedResultsController 链接起来,并且已经意识到我删除所有内容并重新添加的方法是行不通的工作了。

将 Core Data 与服务器端数据同步的可靠方法是什么?

我是否需要为从服务器返回的每个对象 ID 发出获取请求,然后用新数据更新对象?

然后遍历核心数据中的所有对象,看看哪些没有更新,然后删除那些?

这是最好的方法吗?对 Core Data 中的每个对象进行 fetch 似乎有点贵,仅此而已。

伪代码适用于任何答案:)

提前致谢!

4

1 回答 1

3

好吧,考虑你的下载。首先,您应该在后台线程中执行此操作(如果没有,有很多关于如何执行此操作的 SO 帖子)。

我建议你先实现有意义的东西,然后,在你可以从运行的 Instruments 中获得有效的性能数据之后,再考虑性能优化。当然,在“简单”的性能东西上使用一些常识(你的设计可以很容易地处理大的东西)。

无论如何,从在线资源中获取您的数据,然后,对于获取的每个对象,使用“唯一对象 ID”从核心数据中获取对象。您知道只有一个具有该 ID 的对象,因此您可以在 fetch 请求中将 fetchLimit 设置为 1。您还可以将“对象 ID”属性配置为数据库中的 INDEX。这样,您可以从底层数据库中获得最快的搜索,并且一旦找到您的一个对象,它就会停止查找。这应该很活泼。

现在你有了你的对象。更改任何必要的属性。保存,冲洗并重复。

此外,出于多种原因,您可能想知道对象上次更新的时间。我建议为每次更改对象时随当前时间更改的每个对象添加一个时间戳。这也将有助于删除对象。由于您的在线数据库不会告诉您哪些对象被删除,因此您必须通过某种方式知道某个项目是“旧的并且不再需要”。

一个简单的方法是记住您开始更新的时间。处理完下载的所有对象后,您现在可以找到从在线数据库中删除的所有对象。基本上,在您开始更新之前具有“最后一次更新”时间戳的任何对象都应该被删除(因为它们没有在最后一次更新中添加或修改)。您还可以在该字段上为数据库编制索引,这样可以更快地找到这些对象 - 除非您的数据库很大,否则我会等着看 Instruments 对此有什么看法。

于 2012-05-08T13:31:19.887 回答