다른 속성 값을 기반으로하는 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를 사용하는 것입니다?
궁금한 점 - KVO를 사용하는 이유가 있습니까? – LyricalPanda
@LyricalPanda 나는 KVO를 사용하여 "Not"를 사용한다고 가정합니다. 그리고 대답은 아니오입니다, 이유가 없습니다, 나는이 사건에 대해 가장 잘 받아 들여지는 관행이 무엇인지 결정하려고 노력하고 있습니다. KVO를 포함하도록 질문을 업데이트했습니다. 이것이 최고의 솔루션입니까? – Cory
아니요, 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