2014-07-09 6 views
2

다른 속성 값을 기반으로하는 CorData 엔티티에 대한 여러 속성이 있습니다. 예를 들어, transactionTotalValue = transactionPrice * transactionQuantity입니다. 현재 NSManagedObject를 서브 클래 싱하여 이와 같은 사용자 정의 작성기를 만들었습니다.다른 속성을 기반으로하는 CoreData 속성 값

- (void)setTransactionQuantity:(NSDecimalNumber *)transactionQuantity 
{ 
    [self willChangeValueForKey:@"transactionQuantity"]; 
    [self setPrimitiveValue:transactionQuantity forKey:@"transactionQuantity"]; 
    [self didChangeValueForKey:@"transactionQuantity"]; 
    [self updateTotalValue]; 
} 

- (void)setTransactionPrice:(NSDecimalNumber *)transactionPrice 
{ 
    [self willChangeValueForKey:@"transactionPrice"]; 
    [self setPrimitiveValue:transactionPrice forKey:@"transactionPrice"]; 
    [self didChangeValueForKey:@"transactionPrice"]; 
    [self updateTotalValue]; 
} 

- (void)updateTotalValue 
{ 
    self.transactionTotalValue = [self.transactionQuantity decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithDecimal:[self.transactionPrice decimalValue]]]; 
} 

이 방법이 적합합니까? 이 상황에 가장 적합한 방법이 무엇이라고 생각하지 않습니까?

다른 대안은

- (NSDecimalNumber *)transactionTotalValue 
{ 
    [self willAccessValueForKey:@"transactionTotalValue"]; 
    NSDecimalNumber *total = [self.transactionQuantity decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithDecimal:[self.transactionPrice decimalValue]]]; 
    [self didChangeValueForKey:@"transactionTotalValue"]; 
    return total; 
} 


+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key 
{ 
    NSSet *keypaths = [super keyPathsForValuesAffectingValueForKey:key]; 

    if ([key isEqualToString:@"transactionTotalValue"]) { 
     NSArray *affectingKeys = @[@"transactionQuantity", @"transactionPrice"]; 
     keypaths = [keypaths setByAddingObjectsFromArray:affectingKeys]; 
    } 
    return keypaths; 
} 

이 더 나은 옵션을 다음과 같이 KVO를 사용하는 것입니다?

+0

궁금한 점 - KVO를 사용하는 이유가 있습니까? – LyricalPanda

+0

@LyricalPanda 나는 KVO를 사용하여 "Not"를 사용한다고 가정합니다. 그리고 대답은 아니오입니다, 이유가 없습니다, 나는이 사건에 대해 가장 잘 받아 들여지는 관행이 무엇인지 결정하려고 노력하고 있습니다. KVO를 포함하도록 질문을 업데이트했습니다. 이것이 최고의 솔루션입니까? – Cory

+0

아니요, KVO (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/Reference/Reference.html)를 사용하는 자체 willChangeValueForKey/didChangeValueForKey를 사용할 때. 솔직히 KVO로 무엇이든하지 않는다면 setTransactionQuantity/Price 메서드를 삭제하고 합성 속성으로 처리 할 수 ​​있습니다. 이런 종류의 일을 할 때 내가 가진 유일한 방법은'- (int) getTotalValue'입니다. – LyricalPanda

답변

1

transactionTotalValue 속성은 완전히 다른 두 속성에 종속적입니다. 읽기 전용, 비 원자 속성으로 선언하십시오.

@property (nonatomic,readonly) id transactionTotalValue;

그런 다음 게터을 구현할 수 있습니다.

- (id)transactionTotalValue 
    { 
     //check for non-existent needed properties and handle here 

     return [self.transactionQuantity 
     decimalNumberByMultiplyingBy:[NSDecimalNumber 
     decimalNumberWithDecimal:[self.transactionPrice decimalValue]]]; 
    } 

또한 종속 속성에 영향을 미치는 키의 클래스 메서드를 재정의하십시오. 당신이 바인딩을 통해 테이블 ​​소스를 업데이트하는 경우

+ (NSSet *)keyPathsForValuesAffectingTransactionTotalValue 
    { 
     return [NSSet setWithObjects:@"transactionQuantity", @"transactionPrice", nil]; 
    } 

transactionTotalValue 재산

이 필요에 따라 다시 읽을 수 있습니다 말한다. 읽기 전용으로 설정하면 모든 설정 메소드를 피할 수 있습니다.

+0

그래서 TransactionTotalValue를 CoreData 엔터티의 속성으로 만들지 마십시오 – Cory

+0

예, 설정 한 읽기 전용 속성으로 속성이됩니다 그 엔티티에 대한 NSManagedObject 서브 클래스에서. 다른 속성, 즉 의존하는 속성은 사용자가 설정 한 속성이므로 설정자를 수행 할 필요가 없습니다. 사용자는 종속 속성을 직접 설정하지 않습니다. – mikeD

+0

좀 더 명확히하기 위해 transactionPrice 및 transactionQuantity에 대한 사용자 정의 setter가 필요하지 않습니다. – mikeD