2012-12-23 18 views
0

我的問題很簡單。我在CoreData中有10個不同的實體,都具有相同的屬性(名稱,描述...)。要訪問這些屬性我這樣做:使用幾個NSManagedObject

MyEntity *entity=...; 
MyEntity2 *entity2=...; 
... 
MyEntity10 *entity10=...; 

[self myfunction:AnEntity]; 

之後我發送一個隨機對象的功能

-(void)myfunction:(id)myentity 

在這裏,我想用它可以訪問該實體變量屬性無論是類myEntity所或MyEntity2的王......問題是,我不能這樣做:

id myobject=myentity; 
NSLog(@"%@", myobject.name); 

如果有人有一個解決方案,以避免測試一種類對象的:) 謝謝!

回答

0

事實上,你可能電話

[myobject valueForKey:@"name"] 

甚至

[myobject name] 
在你的函數

,因爲這些方法是在運行時解決。如果myobject有一個「名稱」屬性,這將起作用,否則它將在運行時崩潰。

一個清潔的解決方案是定義一個「父實體」 MyEntity與共同屬性namedescription等等,那麼你可以定義子實體MyEntity1MyEntity2,......具有MyEntity爲「父實體」。這些子實體繼承父實體的所有屬性/關係,並且可以具有其他屬性和關係。

相應的被管理對象子類是MyEntity類的子類。你的函數可以是這樣的:

- (void)myfunction:(MyEntity *)myentity 
{ 
    NSLog(@"%@", myentity.name); 
} 

,你可以用任何的子類的實例調用它:

MyEntity1 *myentity1 = ...; 
[self myfunction:myentity1]; 
MyEntity2 *myentity2 = ...; 
[self myfunction:myentity2]; 
+0

謝謝你我認爲我有足夠的解決方案來改進我的代碼:) – Bobyblanco

2

如果你有10個不同的實體,我覺得是時候轉移到NSManagedObject子類。然後你可以定義一個包含所有共享屬性的協議,並聲明你的NSManagedObject子類符合該協議。然後您的電話變爲

-(void)myfunction:(id<SharedAttributesProtocol>)myObject 

{ 
    NSLog(@"%@", myObject.name); 
} 

您提到「description」作爲您的一個共享屬性。 -description方法已經定義,所以你可能想爲該屬性選擇另一個名稱。

對於常見屬性使用父級NSEntity的缺點是最終會出現一個非常寬的表。該表具有所有常見屬性,但也具有每個子實體的所有不同屬性。根據你的對象的大小,這將是一個在iOS下的性能打擊,雖然它在OS X上並不那麼糟糕。

+0

你有一個有效的觀點「寬表,並使用協議是一個很好的選擇,所以我會upvote你的答案。選擇這些解決方案之一或許取決於實體的「不同」以及是否具有父/子關係是「合乎邏輯的」。 –

+0

謝謝你的回答,實際上我認爲最好的方法是創建子類,但它是爲了簡化事物..有時候我只需要訪問一種實體,所以我選擇這個解決方案來澄清。當然,也有你說的記憶問題,幾張小桌子比一張大桌子好! 再次感謝;) – Bobyblanco

相關問題