2010-07-28 6 views
1

코어 데이터 객체에 링크 된 NSArrayController를 자동 재정렬 컨텐츠로 설정하고 술어로 필터링했습니다. 관계를 무효화하고 다른 관계를 지정하기 전까지는 모든 것이 잘됩니다. 그 시점에서, 내 응용 프로그램 충돌 나는 다음과 같은 오류가 나타납니다 얼씬에서KVO 문제 "관찰자를 제거 할 수 없습니다"

Cannot remove an observer for the key path "career.type" from Object, most likely because the value for the key "career" has changed without an appropriate KVO notification being sent. Check the KVO-compliance of the Person class.

를, 그것을 가지고 내 NSArrayController 자동 정렬 할 내용 원인이 문제를 설정하는 것이 나타납니다. 하지만 NSArrayController 수동으로 재정렬하는 데 의존하지 않고이 문제를 해결하기 위해 노력하고있어. 다음은 오류를 유발있어 의사 코드는 다음과 같습니다

object.career = nil; 
object.field = (Field *)item; 

은 여기 내 NSArrayController가 사용하는 조건입니다 : 두 경우 모두에 대한

(career != NIL && career == %@) || (field != NIL && field == %@) 

퍼센트 @는 CoreData 개체입니다.

기본적으로 NSArrayController에 object.career.type에 설정된 관찰자가있는 것처럼 보입니다. 관계를 무효화하면 해당 관찰자가 자동으로 제거 될 때 문제가 발생합니다. 그래서 나는 이것이 잘못된 방향으로 가고 있는지 궁금해하고 있습니까? 개체 사본을 가져와야하며 MOC에서 삭제하고 경력을 nil로 설정하고 필드를 적절하게 설정해야합니다.

관찰자에게 형식이 무효화되었음을 올바르게 알리는 방법은 무엇입니까? 여기에 언급 된 모든 속성과 관계는 바닐라 KVO 호환 게터/세터를 사용합니다.

답변

4

From apples documentation

오류 및 KVO 알림

코어 데이터가 관찰 (KVO) 변경 알림 (키 - 값은 프로그래밍 가이드를 준수 참조) 전송 오류, 키 - 값으로 객체를 회전

객체의 프로퍼티 오류로 변환 된 개체의 속성을 관찰하고 이후에 오류가 발생하면 값이 실제로 변경되지 않은 속성에 대한 변경 알림을받습니다.

값이 의미 상으로 변경되지는 않지만 개체의 구체화에 따라 메모리의 리터럴 바이트가 변경됩니다. 키 - 값 관측 메커니즘은 코어 데이터가 포인터 비교의 관점에서 고려한 값이 변할 때마다 통지를 발행하도록 요구합니다. KVO는 키 경로와 종속 객체 전반의 변경 사항을 추적하기 위해 이러한 통지가 필요합니다.


기본적으로 변경되지 않았음에도 불구하고 알림이 전송됩니다. 그래서 객체가 잘못되었는지 확인해야합니다.

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 

    if ([keyPath isEqualToString:@"pageIndex"]) { 

     // basically remove the observer from the fault object and assign the new 
     if([object isFault]) { 
      [object removeObserver:self forKeyPath:@"pageIndex"]; 
      [the_current_instance_returned_by_core_data addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionOld context:NULL]; 
     } 

     // do whatever you want to do on change... 

    } 
} 
: 그럼이 들어

가 (샘플 코드) 일 ... 이전 관찰자를 제거하고 동일한 경로에 새를 추가
관련 문제