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

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

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

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

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

【问题讨论】:

标签: objective-c ios cocoa-touch core-data


【解决方案1】:

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

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

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

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

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

【讨论】:

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

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

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

【讨论】:

  • 这看起来很有趣,但它似乎会用一个完整的远程数据存储替换我现有的数据存储,这是我的本地数据存储 - 很棒但不是我真正需要的。但我想我可以从中得到一些启发。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2014-07-07
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多