【问题标题】:Optimal way of syncing Core Data with server-side data?将核心数据与服务器端数据同步的最佳方式?
【发布时间】:2012-05-16 15:15:29
【问题描述】:

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

简介:

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

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

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

对服务器的后续请求:

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

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

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

为了让我的应用程序顺利进行,我制定了最简单的解决方案,即删除 Core Data 中的所有对象,然后添加所有新对象,并使用最新的服务器端数据创建。

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

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

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

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

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

任何答案都可以使用伪代码:)

提前致谢!

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 谢谢乔迪!!那里有很多提示,它们确实帮助我重新设计了我做事的方式。
    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多