Iphone 确定NSManagedObject属性是否为可选属性

Iphone 确定NSManagedObject属性是否为可选属性,iphone,objective-c,ios,core-data,nsmanagedobject,Iphone,Objective C,Ios,Core Data,Nsmanagedobject,我正在使用核心数据,并且有一个子类NSManagedObject,名为Person(这是核心数据中的一个实体)。Person对象具有多个属性(例如,firstName,lastName,等等)和关系(例如,朋友,同事)。其中一些属性是可选的,而其他属性是强制性的 给定一个人对象,我如何有效地确定特定的属性或关系是可选的还是强制性的 我希望尽量避免通过Person对象的每个属性进行某种低效的循环,因为我需要相当频繁地调用代码,因此类似于下面的伪代码的东西将是完美的: if ( [[aPerson

我正在使用核心数据,并且有一个子类
NSManagedObject
,名为
Person
(这是核心数据中的一个实体)。Person对象具有多个属性(例如,
firstName
lastName
,等等)和关系(例如,
朋友
同事
)。其中一些属性是可选的,而其他属性是强制性的

给定一个
对象,我如何有效地确定特定的属性或关系是可选的还是强制性的

我希望尽量避免通过Person对象的每个属性进行某种低效的循环,因为我需要相当频繁地调用代码,因此类似于下面的伪代码的东西将是完美的:

if ( [[aPerson getProperty:@"firstName"] isOptional] ) {

    // do stuff

}
……但我不确定是否可以简单地做到这一点。上面的伪代码也只会检查属性,所以我猜如果要检查的属性是关系,那么还需要做其他事情

我意识到,执行单个循环并将所有必需属性的名称存储在一个数组中(然后只检查该数组中是否存在属性名称)可能更有效,这就是我目前正在做的事情,但不幸的是,它不能真正与我的代码结构一起工作(因此需要更“按需”的方法)


任何帮助都将不胜感激:)

您可以在基本子类中编写函数

NSDictionary *d = [[self entity] attributesByName];
NSAttributeDescription *attr = (NSAttributeDescription *)[d objectForKey:@"test"];
BOOL isopt = [attr isOptional];

令人惊叹的。谢谢Elias!我在NSManagedObject中将其作为一个类别,效果非常好:)+1这很有效,但毫无意义。(请参阅我上面的评论。)您永远不需要检查特定托管对象关系的配置,因为使用相同实体初始化的所有对象都具有完全相同的关系配置。我认为您将实体与托管对象混淆了。“可选”仅是实体的属性。在托管对象模型文件中定义的,并且在为其分配上下文后无法更改。如果一个实体具有可选关系,那么使用该实体初始化的所有托管对象都具有该可选关系,并且该关系永远不会更改。您不需要检查托管对象的可选关系,您应该知道模型中的关系是什么。