2012-10-24 61 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