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