2011-09-12 29 views
2

我的模型對象是從SQLite數據庫延遲加載的。不要問爲什麼,但該代碼使用QuickLite填充的對象,這意味着一些看傢俱有訪問時首次使用之前進行。如何在任何@ synthesize'd訪問器之前執行操作?

我想,天真,那valueForKey:setValue:forKey:將由@synthesize「d訪問器調用,這樣我就可以簡單地重載的2種方法,從數據庫填充對象,如果需要的話。不幸的是,這是行不通的:@synthesize'訪問器顯然不使用KVC來獲取/設置它們的表示值。

因此,我的問題是:有沒有辦法在訪問任何@property之前調用某些代碼,而無需親自編寫所有getters/setters?

回答

1

如果您的模型對象是NSManagedObject的子類,那麼您的訪問器將使用KVC(您聲明屬性,然後在.m文件中使用'@dynamic'而不是'@synthesize'來指示訪問器將由其他代碼照顧)。

基本上,它聽起來就像你重新實現在覈心數據的斷層行爲。

基於您的評論,我能想到這樣做將有一個排序,其中包含您的實際對象的代理對象的唯一途徑。所以,你的代理對象會有一個單獨的可見屬性,它是你的實際對象,在訪問器中,你會檢查是否去了這個特定對象的數據庫,如果沒有,你的內務管理。

所以,您的通話將

NSString *someProperty = proxyObject.realObject.someProperty; 

在proxyObject,存取的realObject:

if (beenToTheDatabase) 
    return realObject; 
else 
{ 
    // Do your business 
    beenToTheDatabase = YES; 
    return realObject; 
} 

這是否是多還是少的努力比手動編寫存取或遷移到核心數據,我不知道。

+0

我很樂意這樣做,會做,對於應用程序的下一個主要版本,但現在的問題是,我處理遺留代碼,我不想從底部重構它向上。任何想法如何獲得這種行爲,而不會去核心數據路徑? – DaGaMs

+0

我更新後的答案中有一個半熟的想法。 – jrturton

+0

謝謝,這是一個有趣的黑客...不知道我會走下去的路,但它是我的問題的有效答案。 – DaGaMs

相關問題