2012-07-20 36 views
4

我有一個NSManagedObject類,具有updatedOn屬性。我希望能夠實現這個邏輯,以便在課程的willSave方法中設置它的值。當我試圖做到這一點時,我發現willSave永遠不會被我的這個類的實例調用。NSManagedObject的willSave不會被無效對象調用

經過一番調查,我確定willSave方法沒有被調用新創建的實例,其中updatedOn未初始化爲任何值。由於此屬性未設置爲可選,因此驗證失敗,並且顯然只有實例有效時纔會調用該方法。

我的問題是這樣的:有做這種事情的最佳做法嗎?我是否需要使updatedOn屬性成爲可選項才能解決此問題?或者我應該實現我的課程的awakeFromInsert方法在那裏設置初始值,然後在最終調用willSave方法時覆蓋該值?還是有一些更簡單的方法更有意義?

回答

6

willSave文檔提到了使用時間戳方法,儘管提到了改變屬性值和遞歸的一些複雜性,但它並沒有針對此用途提出具體警告。所以我想,基於這個事實,它可以被認爲是一個合理的地方來把這個功能。

但是,文檔確實指的是使用NSManagedObjectContextWillSaveNotification來計算常見時間戳,所以也許這將是這項工作的替代位置。這需要手動檢查managedObjectContext上的insertedObjectsupdatedObjects集合以找到需要時間標記的對象,但是基於某些快速測試,它似乎在驗證步驟之前調用,因此您將有機會設置所需的屬性這裏。

如果你選擇堅持willSave那麼我猜你有3個選擇。

  • 模型中具有指定默認值的必需屬性。
  • 必需的屬性,其屬性設置在awakeFromInsert或其他合適的點上。
  • 可選屬性。

我覺得任何的選擇是合理的選擇,但我想,如果是我的話,我可能會選擇了NSManagedObjectContextWillSaveNotification因爲併發症只是在willSave設置屬性值。

+0

感謝您的答案Rory ...我曾考慮過使用NSManagedObjectContextWillSaveNotification,但它似乎不太合適,因爲只有一個實體需要時間戳,而且我會通過一組相當大的對象來搜索異味,以找到相對較少的我需要。我決定使用在awakeFromInsert中設置的必需屬性,並在willSave中再次設置。這是一個輕微的煩惱,我必須將它放在兩個位置,但它似乎是我可以使用的最佳方式。 – 2012-07-21 21:55:04