我目前面临的问题是检查对象(NSManagedObject)的属性是否存在。
不幸的是方法
[[MyObject class] respondsToSelector:@selector(myProperty)];
总是返回NO。
我认为这是因为CoreData生成的属性是一个新的风格属性ala
@property (nonatomic, strong) NSString *myProperty
那么有什么想法可以解决这个问题吗?
我非常感谢你的所有建议;)
提前感谢!Alex
[[MyObject class] respondsToSelector:...]
询问元对象是否响应该选择器。因此,实际上,它询问是否存在具有该选择器的类方法。如果您有,您的代码将返回YES
+ (NSString *)myProperty;
它返回NO,因为您有实例方法的等价物:
- (NSString *)myProperty;
您需要在类的实例上调用respondsToSelector:
。
您通常可以直接在元类上使用instancesRespondToSelector:
(因此,[MyObject instancesRespondToSelector:...]
),但核心数据只有在创建对象时才会合成相关的方法实现,因此这是不可能的。但是,您可以通过普通的NSEntityDescription
路由创建一个实例,并在此基础上测试respondsToSelector:
。
由于它都是核心数据,一种替代方案是通过entitiesByName
字典向NSManagedObjectModel
询问相关的NSEntityDescription
,并检查实体描述的propertiesByName
字典。
我唯一需要的情况是动态设置,所以我只寻找setter。我只是为setter编写签名,然后测试它是否存在,然后使用它
NSArray * keys = [myObject allKeys];
for(NSString * key in keys)
{
NSString * string = [NSString stringWithFormat:@"set%@:", [key capitalizedString]];
SEL selector = NSSelectorFromString(string);
if([myObject respondsToSelector:selector] == YES)
{
id object = [dict objectForKey:key];
// To massage the compiler's warnings avoid performSelector
IMP imp = [card methodForSelector:selector];
void (*method)(id, SEL, id) = (void *)imp;
method(myObject, selector, object);
}
}
此代码满足了您可能无法消化字典中收到的所有数据的需要。在这种情况下,它是稀疏的json,因此一些数据可能并不总是存在于json中,因此遍历myObjects属性以查找其对应的密钥将是一种浪费。
您正在合成类文件中的属性吗?
@interface SomeClass : NSObject
{
@property (nonatomic, strong) NSString *myProperty
}
@end
@implementation SomeClass
@synthesize myProperty;
@end