Ios 使用多个NSManagedObject

Ios 使用多个NSManagedObject,ios,core-data,nsmanagedobject,Ios,Core Data,Nsmanagedobject,我的问题很简单。我在CoreData中有10个不同的实体,它们都具有相同的属性(名称、描述…)。要访问这些属性,请执行以下操作: MyEntity *entity=...; MyEntity2 *entity2=...; ... MyEntity10 *entity10=...; [self myfunction:AnEntity]; 在我向函数发送一个随机对象之后 -(void)myfunction:(id)myentity 这里我想使用一个变量来访问实体属性,无论它是MyEntity类

我的问题很简单。我在CoreData中有10个不同的实体,它们都具有相同的属性(名称、描述…)。要访问这些属性,请执行以下操作:

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

[self myfunction:AnEntity];
在我向函数发送一个随机对象之后

-(void)myfunction:(id)myentity
这里我想使用一个变量来访问实体属性,无论它是MyEntity类之王还是MyEntity2。。。问题是我无法做到:

id myobject=myentity;
NSLog(@"%@", myobject.name);
如果有人有避免测试对象类的解决方案:) 谢谢

事实上你可以打电话

甚至

[myobject name]
在函数中,因为这些方法是在运行时解析的。如果
myobject
有一个“name”属性,这将起作用,否则它将在运行时崩溃

一个更简洁的解决方案是定义一个“父实体”
MyEntity
,使用公共属性
name
description
等。然后您可以定义子实体
MyEntity1
MyEntity2
。。。将MyEntity作为“父实体”。这些子实体继承父实体的所有属性/关系,并且可以具有其他属性和关系

相应的托管对象子类是
MyEntity
类的子类。您的函数可以如下所示:

- (void)myfunction:(MyEntity *)myentity
{
     NSLog(@"%@", myentity.name);
}
您可以使用任何子类的实例调用它:

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

如果您有10个不同的实体,我认为是时候转向NSManagedObject子类了。然后,您可以定义一个包含所有共享属性的协议,并声明NSManagedObject子类符合该协议。然后你的电话就变成了

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

{
    NSLog(@"%@", myObject.name);
}
-(void)myfunction:(id)myObject
{
NSLog(@“%@”,myObject.name);
}
您提到“描述”是您的共享属性之一。已经定义了-description方法,因此您可能希望为该属性选择另一个名称


对公共属性使用父N实体的缺点是最终会得到一个非常宽的表。此表具有所有公共属性,但也具有每个子实体的所有不同属性。根据对象的大小,这在iOS下会对性能产生影响,尽管在OS X上不会太糟糕。

您有一个正确的观点,即“宽表,使用协议是一个很好的选择,因此我将对您的答案进行投票。选择其中一个解决方案可能取决于实体的“不同”程度以及是否不同”符合逻辑的“建立家长/孩子关系。谢谢你的回答,实际上我认为最好的方法是创建子类,但这是为了简化事情。”。。有时我只需要访问一种实体,有时我需要访问另一种实体,所以我选择这个解决方案来澄清。当然也有记忆的问题,就像你说的,几张小桌子比一张大桌子好!再次感谢;)谢谢你,我想我有足够的解决方案来改进我的代码:)
-(void)myfunction:(id<SharedAttributesProtocol>)myObject

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