0

我正在创建一个通用类别来isEqual实现NSManagedObject. 因为你不能覆盖我称之为托管对象的 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;
    }
}
@end
4

1 回答 1

0

在 SO 上有一个类似的问题,它处理托管对象的属性与属性比较
那里的方法使用 NSManagedObjectentityDescription而不是属性内省。
您可以使用描述的relationShipsByName属性为您的关系创建类似的获取请求。

如果您只想测试一个对象是否与持久存储中已经存在的对象相同,您可以使用objectID此处描述的属性: 我应该使用 == 还是 [NSManagedObject isEqual:] 来比较同一上下文中的托管对象?

于 2013-04-29T07:10:36.943 回答