我正在创建一个通用类别来为NSManagedObject实现isEqual功能。 因为你无法在托管对象上覆盖isEqual,我称之为isExactlyTheSameAs 。 我使用KVC访问我想要测试的NSManagedObjects上的任何属性。
我遇到的问题是,虽然它只适用于具有属性的简单类。 当我使用valueForKey来获得关系时,它会抛出一个“ 不是键值编码兼容键值 ”错误。
任何人都知道如何让这个为关系工作?
@implementation NSManagedObject (ExactlySame) - (BOOL)isExactlyTheSameAs:(id)object { @autoreleasepool { unsigned int count = 0; objc_property_t *props = class_copyPropertyList([self class], &count); for (int i = 0; i < count; i++) { NSString *name = [NSString stringWithFormat:@"%s", property_getName(props[i])]; id value1 = [self valueForKey:name]; id value2 = [object valueForKey:name]; if ([value1 isKindOfClass:[NSSet class]]) { for (id arrayValue1 in (NSSet *)value1) { if ([arrayValue1 isKindOfClass:[NSManagedObject class]]) { for (id arrayValue2 in (NSSet *)value2) { if (![arrayValue2 isExactlyTheSameAs:arrayValue1]) { return NO; } } } } } else if ([value1 isKindOfClass:[NSString class]]) { if (![value1 isEqualToString:value2]) { return NO; } } else if ([value1 isKindOfClass:[NSNumber class]]) { if (![value1 isEqualToNumber:value2]) { return NO; } } else if (value1 != value2) { return NO; } } return YES; } } @endI'm creating a generic category to implement isEqual functionality for an NSManagedObject. As you can't override isEqual on managed objects i've called it isExactlyTheSameAs. I've using KVC to access any properties i have on the NSManagedObjects i want to test.
The problem i have is that while it works fine for simple classes with just properties. With a relationship it throws a "is not key value coding-compliant for the key" error when i use valueForKey to get the relationship.
Anyone know how to get this working for relationships too?
@implementation NSManagedObject (ExactlySame) - (BOOL)isExactlyTheSameAs:(id)object { @autoreleasepool { unsigned int count = 0; objc_property_t *props = class_copyPropertyList([self class], &count); for (int i = 0; i < count; i++) { NSString *name = [NSString stringWithFormat:@"%s", property_getName(props[i])]; id value1 = [self valueForKey:name]; id value2 = [object valueForKey:name]; if ([value1 isKindOfClass:[NSSet class]]) { for (id arrayValue1 in (NSSet *)value1) { if ([arrayValue1 isKindOfClass:[NSManagedObject class]]) { for (id arrayValue2 in (NSSet *)value2) { if (![arrayValue2 isExactlyTheSameAs:arrayValue1]) { return NO; } } } } } else if ([value1 isKindOfClass:[NSString class]]) { if (![value1 isEqualToString:value2]) { return NO; } } else if ([value1 isKindOfClass:[NSNumber class]]) { if (![value1 isEqualToNumber:value2]) { return NO; } } else if (value1 != value2) { return NO; } } return YES; } } @end最满意答案
这里有一个类似的问题 ,它涉及托管对象的属性与属性比较 。 这种方法使用NSManagedObject的entityDescription而不是属性自省。 您可以使用description的relationShipsByName属性为您的关系创建类似的获取请求。
如果您只想测试一个对象是否与持久存储中已存在的对象相同,您可以使用objectID属性,如下所述: 我应该使用==或[NSManagedObject isEqual:]来比较相同的托管对象背景?
There is a similar question here on SO, that deals with property to property comparison of managed objects. The approach there uses NSManagedObject's entityDescription instead of property introspection. You could use the description's relationShipsByName property to create a similar fetch request for your relationships.
In case you just want to test if an object is the same as one already existent in the persistent store, you could use the objectID property as described here: Should I use == or [NSManagedObject isEqual:] to compare managed objects in the same context?
更多推荐
发布评论