2012-02-16 92 views
2

對於NSKeyValueCoding可以處理的結構類型的屬性,我使用Apple的文檔here中描述的Core Data訪問器模式。如何在mogenerator中使用類型安全的結構類型Core Data屬性?

接口:

例如,NSRange結構可以在覈心數據模型類型可變形的,那麼可避免客戶端的NSValue繁瑣程序通過以下形式的NSManagedObject子類提供存取指定:

@property(assign, nonatomic) NSRange range; 

執行;

- (NSRange) range { 

    [self willAccessValueForKey:@"range"]; 
    NSRange retVal = range; 
    [self didAccessValueForKey:@"range"]; 

    return retVal; 
} 

- (void)setRange:(NSRange)aRange { 

    [self willChangeValueForKey:@"range"]; 
    range = aRange; 
    [self didChangeValueForKey:@"range"]; 
} 

Mogenerator的產生NSManagedObject子類,然而,聲明變形的屬性作爲NSObject的屬性,因此客戶需要的get/set NSValues。 (1)保持簡單的可變形模式,而不是混淆瞬態後備屬性,(2)避免Mogenerator的「機器」類的任何編輯?

回答

1

處理這個問題的最終方法是,如先前接受的答案中的scc所示,更改mogenerator模板文件。他們需要(a)將可變形屬性的訪問器更改爲適當類型(本例中爲NSRange),然後(b)將訪問器添加適當的KVO方法調用。

因爲這是比我有時間,現在要弄清楚該怎麼辦,我的權宜之舉如下:

  • 添加attributeValueClassName關鍵屬性的用戶信息字典(核心數據編輯器),與值NSValue(只是爲了確保生成器的訪問器將NSValue而不是NSObject)。
  • 在人可編輯的mogenerator輸出中,添加訪問器,如問題中的訪問器,除了使用新名稱(例如rangeValue和setRangeValue)。基礎值仍然是持續的NSValues,但我的訪問者負責KVO和裝箱/拆箱。

不理想,但我確實得到強類型訪問器,而不必編輯mogenerator機器文件。

0

只需在模型對象生成器完成其作業後將類型從NSObject更改爲您需要的任何類型即可。之後你不應該有任何編譯器警告。

順便說一句,當我在定義可變形屬性後運行託管對象模型生成器時,我沒有得到NSObject,但是得到了id。沒有警告。

+0

我能做到這一點,但我想避免編輯mogenerator的機器.h文件。 – Cris 2012-02-16 07:36:41

+0

關於NSObject與id事物 - 不同的mogenerator版本,也許?我的1.24 – Cris 2012-02-16 07:37:31

0

你可以改變mogenerator使用的模板文件嗎? (我認爲),如果您遠離標量值,則可以安全使用NSObject *而不是id

+0

當然這是處理它的方法。我(沒有)在想什麼?我將看看模板格式,並在解決方案的後面發佈一些註釋。 – Cris 2012-02-27 22:17:56

0

對於那些願意編輯機器模板文件的人,請對可轉換的NSRange屬性使用以下條件特殊情況。

<$if Attribute.hasTransformableAttributeType && Attribute.objectAttributeClassName == "NSRange" $> 

這是我如何更改我的機器模板頭文件。 https://gist.github.com/2414047

0

您正在閱讀文檔的錯誤部分。請看here

NSRange不需要轉換。還有所有的這些基本結構的方法,如:

NSRangeFromString(); 
NSStringFromRange(); 

所以,你會定義陰影屬性,就像這樣NSString型「rangeAsString」。

在你莫子類,你會遵循關於如何正確轉換和存儲的值,使核心數據知道做這樣當你的對象成爲髒文檔:

myObject.range = NSMakeRange(0,5); 
+0

使用NSValue的NSKeyValueCoding實現比使用陰影屬性更簡單。這些方法之間可能存在其他折衷,但我不知道它們會是什麼。 – Cris 2012-06-08 03:22:37

+0

我願意更正。核心數據當然是一個龐大而令人困惑的框架,我並不是100%精通所有擴展它的方法。你是說你的上面的代碼實際上會與撤消管理聯繫在一起,還是你只發布了一半的解決方案?你也有primitiveRange和setPrimitiveRange:? – 2012-06-08 05:18:39

+0

我沒有使用撤消管理,但AFAI明白,撤消的所有上下文需求都是屬性訪問觸發KVO通知(上面的代碼會這樣做)。我還沒有實現或調用原始訪問器,坦率地說,在這種情況下,管理對象訪問器與伊娃之間的關係並不明確。但是它是核心數據指南中爲NSRange屬性推薦的模式(參見本節末尾部分)(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods。 HTML#// apple_ref/DOC/UID/TP40002154-SW14)) – Cris 2012-06-11 05:28:22