2012-10-24 60 views
1

我有一个使用Web服务填充的基于CoreData的应用程序。当用户更改我的Web服务中某个对象的数据时,我想将这个更改返回到我的Web服务。将CoreData更改推送到Web服务的最佳实践?

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

我是否将CoreData中的对象标记为需要远程保存?如果可能的话每隔几分钟就批量一次?我使用过Flurry和Google Analytics,他们必须做这样的事情,但我不确定最好的方法是什么。

也许核心数据中包含需要更新的EntityName和ObjectID的独立表?

+0

看看这个答案我去年发布:http://stackoverflow.com/questions/5035132/how-to-sync-iphone-core-data-with-web-server-and-then-push- to-other-devices/5052208#5052208 – chris

回答

2

这一定程度上取决于服务器API和什么样的就是了信息。

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

我用一个通用的计划是这样的:

  1. 添加观察员NSManagedObjectContextWillSaveNotification
  2. 当收到此通知,要求管理对象insertedObjectsupdatedObjects,并deletedObjects找到看看改变了什么。
  3. 根据这些结果更新我即将更换的plist。
  4. 同步时,阅读plist,发送更改并清零(确保它与did-save通知同步,以便在不发送更改的情况下不会意外清零)。

您还会遇到其他几个细节 - 例如,如果同步失败,请不要擦除传出的更改列表。

+0

这是我开始走下坡路,几分钟后,我意识到与删除的对象问题的问题。想想我会记录更改的对象并使用它来通知我的服务器。如果我找不到在我的日志中引用的对象,那么它已被删除,我可以通知服务器。 – Slee

2

看看NSIncrementalStore,特别是AFIncrementalStore(它使用NSIncrementalStore)。

好文章讨论都在这里:http://nshipster.com/nsincrementalstore/

+0

这看起来很有趣,但它似乎将取代我所拥有的地方,这是我的本地数据存储与完整的远程数据存储 - 真棒,但不是我真正需要的。但我想我可以从中得到一些解决方案。 – Slee