2014-02-08 35 views
1

這是我的場景的簡化版本,但沒關係。當關系改變時,是否有更新NSManagedObject的好方法?

比方說,你有三個CoreData實體,每個NSManagedObject的一個相應的子類,1對1的關係如下:

人 - > ContactRecord - > ******中國

Person實體有vcard屬性,該屬性以字符串形式保存該人員的vCard數據。

的******中國實體有兩個屬性:實際數量,以及電話號碼(手機,家庭,工作等)的類型。

眼下,在人willSave方法,我更新的虛擬卡屬性。如果Person對象上的另一個屬性發生更改,這可以正常工作。但是,如果我更改PhoneNumber對象上的類型或數字或ContactRecord上的任何屬性,則不會在Person對象上調用willSave方法。

當PhoneNumber對象上的屬性發生更改時,是否有更新Person對象的好方法?

現在,我看到的最好的選擇是使用NSManagedObjectContextWillSaveNotification。該通知調用的方法可以篩選已更改的對象,並恢復反向關係以調用Person對象上的某個方法,但是這發生在NSManagedObjectContext已經保存之後,因此在此之後需要另一次保存。我希望在保存發生之前將此屬性設置爲正確的值。

回答

1

的NSManagedObjectContextWillSaveNotification方法稱爲保存發生之前,所以你可以在那裏進行的變化,它不應該需要第二次拯救。

我在這樣的情況下更傾向於將不存儲虛擬卡可言,但要依賴屬性,是隻讀的。我假設你不需要經常訪問vCard,因此在getter方法中即時生成數據應該可以正常工作,並且數據將始終保持最新。

在保存之前更新數據的一個問題是您必須確保保存。如果您嘗試在未保存的情況下獲取該vcard,它將會過時。從屬只讀屬性不會有這個問題。

+0

你在哪裏看到'-willSave:'的通知優勢? –

+0

我必須誤讀該通知名稱:我認爲它是DidSave,而不是WillSave。這可能會訣竅。 –

+0

Marcus:在「children」中使用'willSave'的缺點是PhoneNumber類需要了解有關Person類的內容。在這個例子中,這是微不足道的,但在應用程序的更復雜的現實中,我想盡可能保持它們的鬆散耦合。 –

1

一個直接的辦法就是繼續使用-willSave:方法中的孩子們。當-willSave:ContactRecord上觸發,然後ping父節點並要求它重新計算該vcard。你可以爲PhoneNumber做同樣的事情。只要恢復關係。

這是假設你的關係是雙向的,其中,而標記爲警告,真的是核心數據的要求。

相關問題