2012-01-26 139 views
2

因此,我明白Objective-C中的類別可用於將方法添加到類中,而無需子類化。我也明白,這些類別不能用於將實例變量添加到類中。將實例變量添加到NSData中

我做的閱讀類擴展,可用於添加實例變量一點點,但我不明白我怎麼可以用類擴展來修改現有類如NSData的。

我的問題是這樣的:

我有一個包含NSURL和NSData的一個核心數據模型。 NSData顯示NSURL的數據。當視圖需要顯示數據時,我做了以下檢查: ---如果[NSData bytes]> 0,則顯示NSData。 ---否則,在取的NSURL數據,當它返回

足夠簡單的顯示數據。但是,當NSURL更新時,我遇到了問題。所以,如果我使用新圖像修改NSURL路徑,由於[NSData字節數]已經大於0,我不會額外調用以獲取新圖像。

我想要做的就是添加一個實例變量的NSData稱爲URLKey,將容納約在數據來源於信息。我無法繼承NSData,因爲我使用的是CoreData。

有沒有人知道一些簡單的解決方案呢?也許我對Class Extensions的理解存在差距,或者可能沒有簡單的方法。

+0

難道你不知道NSData和NSURL的託管對象嗎? –

+0

我可以,但我想抽象出這個功能,以便它不依賴於特定的模型。 –

回答

2

類擴展應該在類中使用你自己實現爲保持高德的方式和某些屬性從頭文件隱藏起來,那應該只包含這應該是在類的外部可見的東西(高德和are't那種東東)。

類別用於已經實現的類,作爲添加附加功能的一種方式。當您想要將一般行爲添加到已知類時,通常需要它們。例如。向NSString添加一個方法+(NSString *)reversedString;,返回一個反轉的實例,所以你可以像這樣使用它:

NSString *someString = @"string"; 
NSString *reverse = [someString reversedString]; 
NSLog(@"%@", someString); //this would output "gnirts" 

關於你提到的具體問題,我可以向你保證,你的CoreDataModel不包含NSURL或NSData的。支持的類型是基元,字符串,二進制數據和可轉換。因此,如果你願意,你可以繼承NSData或NSURL,然後通過設置類型爲「可變形」來與CoreData一起使用它。在完成這些之後,您可以根據需要對NSData進行子類化,並在該過程中使用類擴展,或者僅使用一個類別將所需的方法添加到該類中。從蘋果

報價約變形屬性

背後變形屬性的想法是,你訪問 屬性爲非標準型,但幕後核心數據使用 實例的NSValueTransformer將屬性轉換爲和從 NSData的一個實例。 Core Data然後將數據實例存儲到 持久性存儲中。

+0

這絕對是正確的方法。我遇到了一些問題,但是,NSData的子類化是因爲它是一個類集羣。所以,我創建了一個具有NSData屬性和一個鍵的獨立類,並以這種方式執行了我的實現。 –