将 CoreData 更改推送到 Web 服务的最佳实践?

Posted

技术标签:

【中文标题】将 CoreData 更改推送到 Web 服务的最佳实践?【英文标题】:best practice for pushing CoreData changes to a web service? 【发布时间】:2012-10-24 15:40:25 【问题描述】:

我有一个使用 Web 服务填充的基于 CoreData 的应用程序。当用户更改我的 Web 服务中对象的数据时,我想将该更改推送回我的 Web 服务。

实现此目的的最佳做法是什么?我可能有很多需要发送的更改对象,但用户可能没有连接,我希望它在后台发生。

我是否在 CoreData 中标记对象并需要远程保存?如果可能的话,然后每隔几分钟对它们进行批处理?我使用过 Flurry 和 Google Analytics,他们一定在做类似的事情,但我不确定最好的方法是什么。

也许 Core Data 中有一个单独的表,其中包含需要更新的 EntityName 和 ObjectID?

【问题讨论】:

看看我去年发布的这个答案:***.com/questions/5035132/… 【参考方案1】:

这在一定程度上取决于服务器 API 以及它想要什么样的信息。

在您的 Core Data 实体上添加修改标志或日期是一种简单的方法。只需查找标志为 YES 或日期比上次同步更新的每个对象。但它是有限的——你如何处理告诉服务器你删除了一个对象?您可能需要保留某种外部日志,例如,包含等待发送的外发更改的 plist。

我使用的通用方案是这样的:

    NSManagedObjectContextWillSaveNotification 添加观察者 收到此通知后,请向托管对象询问insertedObjectsupdatedObjectsdeletedObjects,以了解发生了什么变化。 根据这些结果更新我的传出更改列表。 同步时,读取 plist,发送更改并将列表清零(确保这与 did-save 通知同步,这样您就不会在未发送更改的情况下意外清零)。

在此过程中您还会遇到其他一些细节,例如,如果同步失败,请不要删除传出更改列表。

【讨论】:

这是我开始走的路,几分钟后我意识到删除对象问题的问题。认为我将保留更改对象的日志并使用它来通知我的服务器。如果我在我的日志中找不到引用的对象,那么它已被删除,我可以通知服务器。【参考方案2】:

看看 NSIncrementalStore,尤其是 AFIncrementalStore(它利用 NSIncrementalStore)。

在这里讨论两者的好文章:http://nshipster.com/nsincrementalstore/

【讨论】:

这看起来很有趣,但它似乎会用一个完整的远程数据存储替换我现有的数据存储,这是我的本地数据存储 - 很棒但不是我真正需要的。但我想我可以从中得到一些启发。

以上是关于将 CoreData 更改推送到 Web 服务的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

将更新从 Python 服务器推送到 Web 界面

Git-TF将更改推送到错误的服务器上

将通知从 Web 服务器推送到 Android 应用程序

无法将绑定控制更改推送到数据集

使用 Node.js 和 Socket.io 将更改推送到所有客户端

如何使用node js将消息从Web服务器推送到浏览器