2011-09-11 76 views
1

我正在關注Core Data Utlity Tutorial以瞭解爲使Core Data正常工作所需的基礎工作。此實用程序會創建一個Core Data存儲,並在每次運行時保存進程ID和運行日期&。它還顯示以前的運行細節。爲什麼primitiveDate是在Core Data Utility教程中定義的?

一切都很好,直到託管對象類被定義。它定義如下:

@interface Run : NSManagedObject 
{ 
    NSInteger processId; 
} 

@property (assign) NSInteger processId; 
@property (retain) NSDate* date; 
@property (retain) NSDate* primitiveDate; 

@end 

它定義了2個不同的日期屬性。教程還定義了在插入新對象時設置primitiveDate的方法。

- (void) awakeFromInsert { 
    [super awakeFromInsert]; 
    self.primitiveDate = [NSDate date]; 
} 

我不明白爲什麼我們設置primitiveDate代替date財產。我甚至不知道爲什麼我們需要的是dateprocessId,甚至定義了primitiveDate。我嘗試在各行之間閱讀(閱讀完所有行後),但仍無法獲取。請你幫忙嗎?我不知道我錯過了什麼。

回答

3

重要線是

原語訪問器不發射KVO通知致使所述變化被記錄作爲一個單獨的撤消事件。

在您引用的文檔中。

self.date = [NSDate date]; 

self.primitiveDate = [NSDate date]; 

之間的區別在於,前者的問題鍵值觀測(KVO)通知,但後者沒有。 Cocoa + CoreData的內置撤消系統查找KVO通知以正確準備撤消堆棧。這意味着,如果您執行前者,則可以從UI中撤銷該操作,這可能不需要。

這是一個微妙的差異,隨着程序變得越來越大,越來越成熟,它變得越來越重要。

+0

感謝您的回答。但是如何設置'primitiveDate'也設置'date'呢?沒有地方我們正在設置日期,但它似乎被設置,保存和檢索正確? – Hemant

+0

在一個託管對象中,屬性的標準訪問函數'foo'和'setFoo:'涉及大量的魔力。所以,當你想修改一個託管對象的行爲時,你需要使用'primitiveFoo'和'setPrimitiveFoo:',它不涉及奇特的魔法。但是兩者都指向相同的屬性'foo'。閱讀http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154-SW1。 – Yuji

+0

哦,天哪!是**那**嗎?我認爲這是完全不同的財產。感謝您清除它。我陷入了一片灼熱的地獄。 (這些神奇的東西在編程中是雙刃劍。) – Hemant

相關問題