NSManagedObjects 的 isEqual

Posted

技术标签:

【中文标题】NSManagedObjects 的 isEqual【英文标题】:isEqual for NSManagedObjects 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于NSManagedObjects 的 isEqual的主要内容,如果未能解决你的问题,请参考以下文章

丢弃 NSManagedObjects

为啥我的 NSManagedObjects 数组失去了它的属性?

NSManagedObjects 的深拷贝 NSMutableArray

使用 setPropertiesToFetch 时将数据保存在 NSManagedObjects

同一个 NSManagedObjects 之间的多重关系

保存一些 NSManagedObjects 而不是其他的方法?