2011-01-08 6 views
2

변경 사항과 관련이 많은 항목이있을 때마다 NSManagedObject에서 사용자 지정 속성을 업데이트하려고합니다.코어 대다수 관계의 데이터 종속 속성

- (void)addDevicesObject:(Device *)value; 
- (void)removeDevicesObject:(Device *)value; 
- (void)addDevices:(NSSet *)value; 
- (void)removeDevices:(NSSet *)value; 

및 구현 내부 I 변경된 개체에 대한 관측을 추가하거나 제거 : 애플이 정하는 바에 나는 다음과 같은 방법을 무시했습니다. 문제는 내 바인딩 기반 UI에서 데이터를 변경할 때 내 재정의 메서드가 호출되지 않는다는 것입니다. 어떻게해야합니까?

답변

2

요청시 사용자 지정 속성이 계산되면 + keyPathsForValuesAffectingValueForKey :를 사용하여 장치가 변경 될 때 업데이트 알림을 트리거합니다.

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { 
    if([key isEqualToString:@"MyCustomProperty"]) return [NSSet setWithObject:@"devices"]; 
    return [super keyPathsForValuesAffectingValueForKey:key]; 
} 

장치가 변경되었을 때만 계산을 수행하려면 KVO를 사용하여 변경된 경우 알림을받습니다.

//Put this in the various awake... methods 
[self addObserver:self forKeyPath:@"devices" options:0 context:nil]; 
//Put this in the didTurnIntoFault method 
[self removeObserver:self forKeyPath:@"devices"]; 

- (void)observeValueForKeyPath:(NSString *)path ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if(object == self && [path isEqualToString:@"devices"]) { 
     //Update custom property here 
    } else [super observeValueForKeyPath:path ofObject:object change:change context:context]; 
} 
+0

필자가 실제로해야할 필요가 있다는 것을 깨닫지 못했을 때 디바이스가 변경되거나 device.type이 변경 될 때마다 재 계산을 수행한다는 것은 컬렉션의 모든 디바이스에서 유형 속성을 관찰해야한다는 의미입니까? – grivescorbett

+0

기본적으로 그렇습니다.하지만 NSArrayController를 사용하면 자동으로 수행 할 수 있습니다. 컨트롤러의 내용을 장치 키에 바인딩하고 컨트롤러의 arrangedObjects.type 경로를 관찰합니다. 당신이 원한다면 나는 이것을 내 게시물에 추가 할 수 있습니다. – ughoavgfhw

+0

아래의 Martin Brugger의 회신을 참조하십시오. 저는 개인적으로 그의 솔루션을 시도했으며 지금까지는 최고였습니다. – strange

2

이것은 내가 문제를 해결하기 위해 observings를 사용하여 약간의 github project

에 해결 같은 문제는 여전히 (폴트의 속성을 관찰하여 많은 핵심 데이터를 특정 문제를 고려할 필요가 가능한 방법입니다 오류 개체) 및 실행 취소/다시 실행/삭제. 10.5 호환을 유지하려면 중요한 메소드 awakeFromSnapshotEvent도 누락되어 컨텍스트 저장 후 삭제 오브젝트 실행 취소에 대한 관 {을 활성화하는 임시 해결책이 필요합니다.

세터 : 당신이 복잡 할 수 observings을 피하려면

- (void)setDevices:(NSSet *)newDevices 

는 바인딩에서 호출해야합니다. 설정자는 실행 취소/다시 실행 작업에서 호출되지 않습니다! 따라서 종속 데이터 값을 핵심 데이터 모델 속성에 저장해야합니다.

+0

마틴이 프로젝트는 정확히 내가 원했던 것입니다. 파생 된 속성을 관리하고 업데이트하는 데 코드를 사용하는 것이 얼마나 쉬운 지 믿을 수 없습니다. 인터넷과 코드에 대한 구체적인 예를 찾을 수 없었습니다. 나는 당신의 대답이 옳지 않은 것으로 믿을 수 없습니다. 많은, 많은 감사 !!!!!! – strange

+0

누군가 자신이 실제로 코드를 사용하고 있다는 사실을 알게 된 것을 기쁘게 생각합니다. 도움이 필요하거나 버그를 찾으신다면 저에게 연락하십시오. –

관련 문제