【问题标题】:isEqual for NSManagedObjectsNSManagedObjects 的 isEqual
【发布时间】:2013-04-29 05:54:17
【问题描述】:

我正在创建一个通用类别来为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;
    }
}
@end

【问题讨论】:

    标签: iphone ios objective-c core-data


    【解决方案1】:

    有一个similar question here on SO,用于处理托管对象的属性与属性比较
    那里的方法使用 NSManagedObject 的 entityDescription 而不是属性自省。
    您可以使用描述的 relationShipsByName 属性为您的关系创建类似的获取请求。

    如果您只想测试一个对象是否与持久存储中已经存在的对象相同,您可以使用objectID 属性,如下所述: Should I use == or [NSManagedObject isEqual:] to compare managed objects in the same context?

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2014-02-27
      • 2014-03-06
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多