2011-03-04 55 views
6

我正在爲使用Web服務提供的數據的iOS編寫應用程序。我正在使用核心數據進行本地存儲和數據持久化,因此如果Web無法訪問,則某些核心數據集可供用戶使用。核心數據與Web服務推薦模式?

在構建這個應用程序時,我一直在閱讀大量關於核心數據的文章。雖然這樣做的機制似乎有很多,但我對此的一般原則/模式卻少見了。

我想知道是否有一些推薦的交互模型的良好參考。

例如,用戶將能夠在應用上創建新對象。比方說,用戶創建一個新的員工對象,用戶通常會創建它,更新並保存它。我已經看到了將這些步驟中的每一個都更新到服務器的建議 - >當用戶創建它時,以及用戶更改字段時。如果用戶在最後取消,則將刪除發送到服務器。針對同一操作的另一個不同建議是將所有內容保存在本地,並且只在用戶保存時纔將完整更新發送到服務器。

這個例子不談,我很好奇,如果有一些關於如何處理CRUD操作的一般性建議/模式,並確保它們在web服務器和coredata之間同步。

非常感謝。

回答

0

您可能想要閱讀有關「交易」的內容 - 這基本上是將多個操作/更改分組爲單個原子操作/更改。這有助於避免可能導致服務器數據不一致的部分保存。

最終,這是一個非常大的話題 - 尤其是如果服務器數據在多個客戶端之間共享。最簡單的,你會想要決定基本的政策。最後保存勝利嗎?服務器數據存儲中的對象是否存在遠程鎖定的概念?當兩個客戶端編輯同一個對象的相同屬性時,如何解決衝突?

關於在iPhone上如何完成任務,我同意occulus的「完成」爲持久更改服務器提供了一個自然點(在單獨的線程中)。

1

我認爲在您提到的情況下,最好的方法是僅在本地存儲數據,直到用戶提交添加新記錄的時間點。發送每個字段編輯到服務器有點過分。

iPhone應用程序的一般習慣是沒有「保存」之類的東西。用戶通常會期望事情在某個合理的位置被執行,但不會以節省本身的形式呈現給用戶。

例如,假設您有一個用戶界面,可以讓用戶編輯某種記錄,這些記錄將保存到本地核心數據併發送到服務器。在用戶退出用戶界面以創建新記錄時,他們可能會點擊一個名爲「完成」的按鈕(N.B.通常不稱爲「保存」)。在他們點擊「完成」的時候,您會想要啓動核心數據寫入,並開始推送到遠程服務器。服務器p h不一定會使用戶界面癱瘓,或者讓它們等待直到完成 - 讓它們繼續使用應用程序更好 - 但它正在發生。如果推送到服務器的更新失敗,則可能需要將其發送給用戶或執行相應的操作。

當計劃向核心數據和/或遠程服務器寫入的粒度時,問自己一個很好的問題是:如果應用程序崩潰或電話用完,在任何特定位置應用程序嗎?可能發生多少數據丟失?好的應用程序可以降低數據丟失的風險,並且可以以任何原因退出之後以與以前相似的狀態重新啓動。

+0

+1我在設計一個核心數據和服務器元素沒有交織在一起並且能夠完全分開工作的設計。這允許應用程序離線工作,例如飛行模式不失功能。將數據保存到核心數據,然後將其讀回併發送給服務器。這種方式使得用戶界面更加靈敏,避免了數據丟失。 – TechZen 2011-03-05 22:28:38

1

準備好把你的頭髮撕掉很多。我一直在研究這個問題,問題是Core Data示例非常簡單。當你轉向一個複雜的模型,並嘗試使用NSFetchedResultsController及其委託時,你會遇到使用多個上下文的各種問題。

我使用一個在背景「塊」中填充web服務中的數據,另一個使用tableview - 最有可能最終使用tableview作爲主列表和詳細視圖。

如果您希望在從服務器接收數據或從服務器發送數據時保持應用程序響應,請在Cocoa中使用塊進行刷新。