2012-05-08 49 views
3

我有我认为是非常普遍的情况,但由于我是iOS编程新手,我不确定编码它的最佳方式。将核心数据与服务器端数据同步的最佳方式?

梗概:

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

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

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

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

  • 可能无法返回某些对象,他们已经删除了服务器上 - 在这种情况下,我需要删除从核心数据对应的对象 - 这样我正确地反映了服务器的状态。

  • 某些对象的属性已更改,因此相应的管理对象需要使用新数据进行更新。

我的解决办法 - 和问题你

要得到的东西去在我的应用程序,我做了删除在核心数据中的所有对象,然后将所有的新对象,以创建最简单的解决方案最新的服务器端数据。

我不认为这是最好的方式来处理它:)随着我的应用程序的进展,我现在想要将我的tableview与NSFetchedResultsController连接起来,并且已经意识到我的方法是删除所有东西,添加不会再工作。

什么是同步核心数据与服务器端数据的尝试和可信赖的方式?

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

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

这是最好的办法吗?对Core Data中的每个对象进行提取看起来有点贵,就这些。

的伪码罚款任何答案:)

在此先感谢!

回答

3

好吧,考虑下载。首先,你应该在后台线程中做这件事(如果不是这样,那么有很多SO帖子会讨论如何做到这一点)。

我建议您首先实施什么是有意义的,然后在从运行的仪器获得有效的性能数据后,考虑性能优化。当然,在“简单”性能的东西上使用一些常识(你的设计可以轻松地处理大的问题)。

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

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

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

一个简单的方法是记住开始更新的时间。在处理完下载的所有对象之后,您现在可以找到从联机数据库中删除的所有对象。基本上,应该删除开始更新之前具有“上次更新”时间戳的任何对象(因为它们未在上次更新中添加或修改)。你也可以在这个字段上编制索引数据库,这将使查找这些对象的速度更快 - 除非你的数据库很庞大,否则我会等待看看有哪些仪器可以对此进行说明。

+0

谢谢乔迪!在那里的许多技巧真的帮助我重新设计了我做事的方式。 – Stretch

相关问题