嘿,我正在爲我們的應用程序的模型層工作。如何異步同步CoreData和REST Web服務,並同時將任何REST錯誤正確傳播到UI中
一些的要求是這樣的:
- 應該在iPhone OS 3.0+工作。
- 我們的數據來源是一個RESTful Rails應用程序。
- 我們應該使用核心數據在本地緩存數據。
- 客戶端代碼(我們的UI控制器)應該儘可能少地瞭解任何網絡內容,並且應該使用Core Data API查詢/更新模型。
我已經簽出了WWDC10會話117上建立一個服務器,驅動用戶體驗,花了一些時間檢查出Objective Resource,Core Resource和RestfulCoreData框架。
Objective Resource框架本身不與Core Data交談,僅僅是一個REST客戶端實現。 Core Resource和RestfulCoreData都假設你在代碼中與Core Data交談,他們解決了模型層背景中的所有問題。
所有看起來不錯,到目前爲止,最初我雖然無論是核心資源或RestfulCoreData將覆蓋所有的上述要求,但......有一對夫婦沒有他們的事情看似偶然正確地解決:
- 在保存本地更新到服務器時,主線程不應被阻塞。
- 如果保存操作失敗,應將錯誤傳播到UI,並且不應將更改保存到本地Core Data存儲。
核心資源發生在你對你的管理對象情境呼叫- (BOOL)save:(NSError **)error
發出所有的請求到服務器,因此能夠提供底層請求到服務器的正確NSError實例失敗不知何故。但是它會阻止調用線程,直到保存操作結束。失敗。
RestfulCoreData保持您的-save:
調用不變,並且不會爲客戶端線程帶來任何額外的等待時間。它僅僅注意到NSManagedObjectContextDidSaveNotification
,然後在通知處理程序中向服務器發出相應的請求。但這樣-save:
調用總是成功完成(當然,如果Core Data與已保存的更改一致,並且實際調用它的客戶端代碼無法知道保存可能無法傳播到服務器,因爲某些404
或421
或發生任何服務器端錯誤。而且,本地存儲變得更新了數據,但服務器從來不知道這些變化。失敗。
所以,我在處理這些問題尋找一個可能的解決方案/常見的做法:
- 我不想調用線程上的每個
-save:
呼叫阻塞而網絡請求發生。 - 我想以某種方式在UI中獲取某些同步操作出錯的通知。
- 我想實際的核心數據保存失敗,以及如果服務器請求失敗。
任何想法?
哇,你不知道你通過問這個問題救了我多少麻煩。我目前實現了我的應用程序,讓用戶在每次撥打電話時都等待數據(儘管是.NET Web服務)。我一直在想辦法讓它異步,但不知道如何去做。感謝您提供的所有資源! – 2010-07-27 14:25:00
優秀的問題,謝謝。 – Justin 2010-07-28 12:25:03
核心資源的鏈接已損壞,有誰知道它現在託管在哪裏? – 2012-05-08 09:00:20