0

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
4

1 に答える 1

0

SOには、管理対象オブジェクトのプロパティとプロパティの比較を扱う同様の質問があります。そこでのアプローチでは、プロパティ イントロスペクションの代わりに
NSManagedObject を使用します。 説明のプロパティを使用して、関係に対して同様のフェッチ リクエストを作成できます。entityDescription
relationShipsByName

オブジェクトが永続ストアに既に存在するオブジェクトと同じかどうかをテストしたいだけの場合は、objectIDここで説明されているようにプロパティを 使用できます。 ?

于 2013-04-29T07:10:36.943 に答える