NSManagedObjects的isEqual(isEqual for NSManagedObjects)

编程入门 行业动态 更新时间:2024-10-10 08:18:35
NSManagedObjects的isEqual(isEqual for NSManagedObjects)

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

I'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?

更多推荐

本文发布于:2023-08-07 02:51:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1458406.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:NSManagedObjects   isEqual

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!