2012-05-25 47 views
1

我有一個具有多個屬性的實體,其中一個名爲lastModificationDate。無論何時設置了對象的任何屬性,我都想更新lastModificationDate。爲CoreData屬性/屬性提供自己的setter

如果我沒有使用核心數據,我只會提供我自己的setter屬性和更新lastModificationDate。但是,我不確定是否應該搗亂CoreData的屬性。

這樣做的最好方法是什麼?

回答

1

重寫制定者很容易做到,你必須確保你開火權通知,一切工作(包括志願)。

- (void) setThing:(NSObject *)myThing { 
    self.lastUpdateDate = [NSDate date]; 
    [self willChangeValueForKey:@"thing"]; 
    [self setPrimitiveThing:myThing]; 
    [self didChangeValueForKey:@"thing"]; 
} 

這就是說,如果你需要做的就是我的代碼顯示(基本設定值和更新的最後更新日期),你好得多使用鍵 - 值觀察和反應的通知。它更簡單,更清潔。

+0

如果核心數據框架在幕後發生變化,那可能會發生災難性的變化。但是,是的,現在這會起作用。 –

+0

實際上,雖然建議(除了您提到的其他原因)未實現自定義訪問器,但該技術已在[Apple's documentation]中得到充分記錄(http://developer.apple.com/library/mac/#documentation/Cocoa /Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154-SW14) – mprivat

0

如果您使用的是NSManagedObject子類,那麼您不應該重寫屬性變量(設置器),因爲這些實現是在運行時提供的(因此@dynamic而不是@synthesize)。你可以,如果你真的想,但它更混亂,沒有理由。改爲使用鍵值觀察(KVO)。當數值發生變化時,它會讓你知道。

蘋果的志願文檔是偉大的:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177i

+2

是的KVO很可能是正確的解決方案,但其餘的答案是錯誤的。檢查覈心數據編程指南[託管對象訪問器方法](http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/ TP40002154-SW5)。實際上Xcode的片段庫中還有一個名爲「Core Data property Accessors」的代碼片段,它給出瞭如何覆蓋這些方法的基本概述。 –

+0

是的,我知道,但它是一團糟,沒有意義。 –

+0

有可能沒有意義,但你的回答表明你不能這樣做,因此我的評論。 –