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 的深拷贝 NSMutableArray