2013-04-29 37 views
0

我正在創建一個通用類別來實現NSManagedObjectisEqual功能。由於您無法覆蓋託管對象上的isEqual,我稱它爲isExactlyTheSameAs。我使用KVC訪問我想要測試的NSManagedObjects上的任何屬性。isEqual for 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 

回答

0

有一個similar question here on SO,與財產被管理對象的屬性比較交易。
該方法使用NSManagedObject的entityDescription而不是屬性自省。
您可以使用說明的relationShipsByName屬性爲您的關係創建類似的提取請求。

如果你只是想測試一個對象是否是相同的一個持久存儲已經存在,你可以按此處所述使用objectID屬性: Should I use == or [NSManagedObject isEqual:] to compare managed objects in the same context?