2013-02-18 107 views
2

作爲我的同步解決方案的一部分,我對某個類的所有對象使用sync status。只要該對象的特定(不是全部)屬性發生更改,我想更新狀態。屬性更改時更新標誌

我正在考慮四種方法:手動設置代碼中的地位,無論我改變 一些需要同步

  1. 。這是最明顯的,但也是最費力和容易出錯的(我需要記得在添加新功能時添加同步狀態更新)。
  2. 使用核心數據通知(例如willSaveNSManagedObjectContextObjectsDidChangeNotification)對其進行跟蹤。這似乎是乍一看最合適 - 我只需在我的AppDelegate中註冊通知,並且每次更新 狀態。但是有可能檢查 的更改,並且只有在我關心的屬性更新爲 時才更新同步狀態?另外,不會設置 sync_status本身也會觸發這個通知,導致我陷入無限循環?我將如何解決這個問題?
  3. 關於我關心的屬性的自定義setter。我有 麻煩試圖讓這個工作之前,並最終決定 試圖離開標準的核心數據獲取/設置單獨。但如果它是最合適的,我會回到這個問題。
  4. KVO。我之前沒有使用過這種模式,但它可能是最簡單的 只需註冊屬於我的 有關的屬性更改通知並在那裏設置標誌。但我會在哪裏做這個?我需要 來監視班級的每個對象,那麼是否有可能開始在同一對象的awakeFromInsert中觀察屬性的KVO通知的 ? 也就是說,無論何時創建一個對象,立即就有相同的對象偵聽屬性A的更改並在其觸發時設置它自己的sync_status

哪種方法最適合我?也許我錯過了一些其他的想法?

+0

另一種方法是通知接收方有任何變化的協議。你可以用字典來傳輸相關數據? – katzenhut 2013-02-18 23:16:00

回答

2

手動設置狀態代碼

可能是一個壞主意,整整你所說的原因。你需要在各種情況下做到這一點。您可能並不總是應用程序的開發人員。有一天你或別人會忘記它。即使你不這樣做,你可以在整個可以集中的地方得到額外的代碼。

使用核心數據通知進行跟蹤[...]此外,不會設置sync_status本身也會觸發此通知,導致我陷入無限循環?

這取決於你是如何做到的。如果您使用輔助NSManagedObjectContext,則傾聽NSManagedObjectContextDidSaveNotification可能會有效。通過這種方式,您可以設置同步標誌,保存更改並避免循環,因爲您將保存在您未觀察到的不同上下文中。

使用NSManagedObjectContextObjectsDidChangeNotification也可以工作。當對象屬性被改變但是實際上還沒有進行保存時會被張貼。檢查userInfo字典以查看您關心的任何內容是否已更改,如果有,請設置sync_status標誌。設置標誌會觸發一個新的通知,但它會是一個你不關心的,所以你打破了循環。使用單獨的上下文也可以防止循環。

關於我關心的屬性的自定義setter。

絕對可行,雖然取決於您關心的屬性數量,但最終可能會有很多訪問器來更新同步狀態。在你提到的四個中,這是我會使用的一個。

一個相關但更簡單的方法是覆蓋您的託管對象類上的willSave。這將在保存之前被調用。實現它到

  1. 通過[self changedValues]查看觸發同步的屬性。
  2. 如果找到它們中的任何一個,請設置同步標誌。

這樣,每個實體只有一個自定義方法,無論有多少屬性最終觸發同步標誌。

志願

應該工作,但可能不太直觀,以獲得比定製的制定者權工作。

當我不得不做這樣的事情時,我把同步信息放在我的數據存儲之外。我聽NSManagedObjectContextDidSaveNotification,並在觀測方法,我想:

  1. 去翻userInfo,看看有什麼改變了
  2. 獲取NSManagedObjectID每個對象,將需要同步
  3. 轉換對象ID到NSStrings並將其添加到保存在單獨文件中的列表中。

在成功同步時,我會清除對象ID列表。

這個想法主要是因爲同步標誌比實際模型數據更多的元數據,所以我將它保留在模型之外。如果你喜歡把它保留在模型中,我會重寫willSave

+0

謝謝,湯姆。我將考慮你的外部方法。當我想要同步多個對象類型時,它似乎是最具可伸縮性的,並且每次我想知道要同步的內容時都不必過濾整個數據集。您是否還存儲了要在覈心數據中同步的對象列表?還是其他一些機制? – 2013-02-19 00:38:34

+0

我把它放在一個屬性列表文件中,這對應用程序來說已經足夠了。將每個託管對象ID轉換爲NSString(通過其URIRepresentation)並將其添加到集合中。我需要分別處理插入,更新和刪除操作,所以我使用了帶有三個鍵的頂級詞典,其中的值是對象ID的數組。 – 2013-02-19 01:15:16

+0

您是否曾經在NSManagedObjectContextDidSaveNotification *中確定哪些屬性發生了變化?由於通知中的用戶信息僅包含新保存的值,因此我不確定我能做到這一點。 – 2013-02-19 03:40:08