2010-06-26 41 views
4

用CoreData編寫我的第一個應用程序。我使用的是引導我的書中有這樣的代碼:使用KVC/valueForKey與屬性訪問NSManagedObject字段 - 哪個更好?

// 'Person' is my managed object class 
Person *newPerson = [NSEntityDescription 
    insertNewObjectForEntityForName:@"Person" 
    inManagedObjectContext:self.managedObjectContext]; 

[newPerson setValue:nameField.text forKey:@"name"]; 

書中說,使用屬性風格,例如

newPerson.name = nameField.text; 

也可以,但是,「這是很常見的,看核心數據的代碼使用KVC方法」

對我來說,我看不出一個理由使用KVC的方法;神奇的字符串只是乞求運行時錯誤,而且還有更多的輸入。

這就是說,我想了解我的習慣現在關於「iPhone的方式」做事情。

這些方法是否有區別,如果大多數人使用KVC的第一個方法......爲什麼?

+0

您正在使用哪本書? – Yuji 2010-06-27 04:37:29

+0

Dudney和Adamson編寫的PragProg書籍 – davetron5000 2010-06-27 16:28:41

回答

3

大多數人不會使用我見過的KVC方法;我沒有,因爲你描述的原因。

要保存你的理智,用Mogenerator建立你的訪問者:

http://rentzsch.github.com/mogenerator/

這是一個命令行工具,生成您可以用它來獲取CoreData對象的代理對象,有一些方便的方法 - 但即使更好的是,當您從數據模型中重新生成類時,您可以添加自己的方法的某些類別覆蓋將不會被破壞。

XCode也可以從你的模型生成數據對象,但類更簡單(只是訪問器),mogenerator是我認爲更容易反覆使用(這很重要,因爲你會傾向於隨着時間的推移改變模型) 。也許下一個XCode在這方面會更好。

我通常將所有數據模型類生成到名爲「DataObjects」的類下的子目錄中 - 然後每當您從數據模型重新生成類時會重新添加整個目錄,從而導致創建新類(當您有新的實體)。一個示例命令行運行的樣子:

mogenerator -m ../MyProject.xcdatamodeld/MyProject-v1.xcdatamodel 

這將生成類到從給定的數據模型當前目錄(在這種情況下,我只用第一個版本一個版本的模型)。

+0

使用KVC在託管對象上設置屬性非常有用。例如,您可以在傳遞JSON字典的'NSManagedObject'上創建一個類別,MO屬性將自動填充字典中的值。或者,創建一個擴展'setValue:forKey'的類別,但只有在與舊值不同時才設置新值。如果你有'NSFetchedResultsControllers'正在監視數據變化,並且你不希望你的tableView經常動態地僞造/改變虛假的變化,那麼這一點很重要。 – memmons 2014-02-28 20:09:09

+0

您可以使用mogen生成的類創建相同的字典輸入類別,mogen類只是擴展您可以對託管對象執行的操作......您還可以在設置新值之前調整mogen模板以添加比較檢查(儘管我個人認爲每次插入或讀取存儲時執行該檢查的潛在開銷將比偶爾設置重複值時節省的更多) – 2014-03-02 05:42:36

0

name是NSEntityDescription的財產,所以newPerson.name罰款。

但是,當您將自定義屬性添加到自定義實體時,它僅在運行時才知道 - 因此newPerson.favouriteRestaurant將觸發編譯時警告,即使它沒有問題。

這很煩人。要擺脫它

一種方法是使用

[newPerson setValue:@"Crazy Maria's" forKey:@"favouriteRestaurant"] 

這可能是一個有用的方法來阻止編譯器在嘮叨其他幾個場景時,你鑼使用運行時魔法。

+0

如果需要,您可以在@interface中添加屬性'favouriteRestaurant'來關閉編譯器。 – Yuji 2010-06-27 04:36:26

+0

你是說如果你爲你的實體添加一個自定義的類? – hooleyhoop 2010-06-27 16:43:26

1

屬性將導致性能比直接KVC使用率提高一小部分。然而,KVC確實有其用途,特別是在使用keyPath而不僅僅是key時。

當您發現或動態訪問對象上的值時,KVC也很有用。

對於每一天的使用,肯德爾絕對是正確的,使用mogenerator和利用屬性。更容易編碼,更容易維護等。然而KVC絕對有它的地位,而且非常有用。