2010-06-30 57 views
2

我知道這個問題已經被提前,但解釋對我來說有點不清楚,我的問題是一個更一般的問題。我試圖概念化如何使用遠程Web服務定期更新iPhone應用程序中的數據。理論上,手機中的一部分數據會定期同步(僅在更新時)。而其他數據則需要用戶上網,並且可以隨時請求。核心數據和JSON問題

從概念上講,這似乎可以使用XML-RPC或JSON和核心數據。我想知道是否有人對最佳實現方式有意見,我是新手iPhone開發人員,但我從概念上理解了這一過程。

謝謝

回答

2

,當你不擁有控制權的服務器同步一個實體的集合,這裏是一個辦法:

  1. 添加touched BOOL屬性的實體描述。

  2. 在同步嘗試中,將所有實體實例標記爲未觸及(touched = [NSNumber numberWithBool:NO])。

  3. 循環遍歷服務器端(JSON)實例,並將實體從Core Data存儲添加或更新到服務器端存儲,反之亦然。更新的方向取決於您的同步策略,以及哪一方的數據「更新鮮」。無論哪種方式,標記添加,更新或同步的核心數據實體觸摸(touched = [NSNumber numberWithBool:YES]

  4. 根據您的同步策略,從您的核心數據存儲中刪除所有實體實例仍然未觸及。未接觸到的實體大概會從服務器端存儲中刪除,因爲在這些對象的核心數據存儲和服務器之間沒有發生添加,更新或同步事件。

同步是相當數量的工作來實現,並取決於您需要支持的同步程度。如果你只是拉取數據,第3步就簡單得多,因爲你不需要將對象更新推送到服務器。

0

同步困難,非常困難。理想情況下,您希望從服務器接收更改的變化量,然後對Core Data中的每個記錄使用唯一的ID,只更新那些新的或更改的記錄。

假設你可以做到這一點,那麼代碼是非常簡單的。如果您在兩個方向上同步,則情況會變得更加複雜,因爲您需要跟蹤雙方的增量並處理衝突。

你能澄清你想完成什麼類型​​的同步?它是雙向還是隻能拉動?

+0

標記人沒有評論,爲什麼? – 2010-07-28 17:16:56

0

我有一個答案,但它很爛。我目前正在尋找一種更可接受/可靠的解決方案(即任何Marcus Zarra製作的)。

我所做需要一些工作......嚴重,因爲它不工作的所有時間...

的移動設備具有實體,它們的版本的JSON目錄,和一個URL指向到具有實體內容的json文件。

服務器具有相同的設置,列出實體的目錄等。

每當移動設備啓動時,它都會將其本地目錄的實體版本與服務器上的目錄進行比較。如果服務器上的這些版本中的任何版本較新,則它爲用戶提供下載實體更新的機會。

當用戶選擇更新時,移動設備現在擁有每個新/更改實體的URL並將其下載。下載後,應用程序將爲每個已更改的實體吹走所有對象,然後從JSON插入新對象。如果發生錯誤,刪除/插入將回滾到更新前的狀態。

這工作,有點。當它出現錯誤時,我無法在調試會話中捕獲它,所以我不確定在過程中可能導致損壞或不一致的原因。

+0

我想知道是否應該在更新受影響的實體後強制應用程序退出?現在,我嘗試優雅地整合這些更改,並告訴所有相關的表格,他們需要更新。我還想知道是否這些麻煩是由於數據在運輸過程中的腐敗造成的......如果我應該在更新中包含某種校驗和來檢查有效性。 – 2011-02-15 16:50:49

+0

我不知道這是否是一個可行的解決方案,但我剛剛在Github上找到了RestKit ...它看起來會處理本地核心數據存儲和雲之間的同步。 https://github.com/twotoasters/RestKit – 2011-02-15 19:16:52