我认为这是一种非常常见的情况,但由于我是iOS编程的新手,我不确定编码它的最佳方式。
梗概:
我在服务器上有数据,可以通过REST服务由iPhone应用程序检索。在服务器端,数据是具有外键的对象(整数id号)。
我将通过REST检索的数据存储在Core Data中。托管对象具有“objId”属性,因此我可以在其余代码中唯一标识托管对象。
我的应用必须始终反映服务器数据。
对服务器的后续请求:
某些对象可能无法返回,它们已在服务器上删除 - 在这种情况下我需要从Core Data中删除相应的对象 - 这样我才能正确反映服务器的状态。
某些对象具有已更改的属性,因此相应的托管对象需要使用新数据进行更新。
我的解决方案 - 并向您提问
为了让我的应用程序正常运行,我做了最简单的解决方案,删除Core Data中的所有对象,然后添加所有新对象,使用最新的服务器端数据创建。
我不认为这是接近它的最好方法:)随着我的应用程序的进展,我现在想要将我的tableview与NSFetchedResultsController链接,并且已经意识到我删除所有内容并重新添加的方法不再有用了。
将核心数据与服务器端数据同步的尝试和信任方式是什么?
我是否需要为从服务器返回的每个对象ID提取获取请求,然后使用新数据更新对象?
然后浏览核心数据中的所有对象并查看哪些对象尚未更新,并删除它们?
这是最好的方法吗?对核心数据中的每个对象进行获取似乎有点贵,就是这样。
任何答案都可以使用伪代码:)
提前感谢!
答案 0 :(得分:3)
好吧,考虑下载。首先,您应该在后台线程中执行此操作(如果没有,有很多SO帖子讨论如何执行此操作)。
我建议您首先实现有意义的功能,然后,在您从运行的仪器获得有效的性能数据后,请考虑性能优化。当然,在“简单”的性能方面使用一些常识(你的设计可以很容易地处理大的)。
无论如何,从在线资源获取数据,然后,对于每个获取的对象,使用“唯一对象ID”从核心数据中获取对象。您知道只有一个具有该ID的对象,因此您可以在获取请求中将fetchLimit设置为1。您还可以将“对象ID”属性配置为数据库中的INDEX。这样,您可以从底层数据库中获得最快的搜索,并且一旦找到您的一个对象就知道停止查找。这应该是非常活泼的。
现在你有了自己的对象。更改所需的任何属性。保存,冲洗并重复。
此外,由于多种原因,您可能想知道上次更新对象的时间。我建议为每个对象添加一个时间戳,每次更改一个对象时,该时间戳会随着当前时间而改变。这也有助于删除对象。由于您的在线数据库不会告诉您哪些对象被删除,您必须知道某个项目是“旧的,不再需要”。
一种简单的方法是记住开始更新的时间。处理完下载后的所有对象后,您现在可以找到从在线数据库中删除的所有对象。基本上,应该删除在开始更新之前具有“上次更新”时间戳的任何对象(因为它们未在上次更新中添加或修改)。你也可以在这个字段上索引数据库,这样可以更快地找到这些对象 - 除非你的数据库很大,我等着看看这个文书对这个文件有什么看法。