2009-07-02 2 views
4

나는 KVC/KVO에 맞았다. 강력한 슈퍼. 한 가지 문제가 있습니다. MVC etho가 사실이 되려고하지만 Objective-C 클래스 인스턴스의 할당 또는 할당 해제를 모니터링하는 관찰 패턴을 사용할 방법이 없습니다.개체 인스턴스 생성/제거를 어떻게 관찰합니까?

컨트롤러 (또는 위임자)로부터 관찰하고자하는 내부 메시지가 세분화 된 모델을 가지고 있기 때문에 실제로 중요합니다. 내게 걸림돌은 내가 모델 외부에서 어떻게 캡슐화를 손상시킬 모델의 내부 논리에 대해 알지 않고 컨트롤러가 할당 해제 될 하위 구성 요소에 대한 관찰자를 제거 할 수 있는지를 보지 못한다는 것입니다.

누군가이 시나리오에 대한 접근 방식을 제안 할 수 있습니까?

덕분에, 더그

답변

6

Doug - 당신이하고있는 일과 최선의 방법 (또는 적절하다면)으로 문제에 KVO를 적용하는 데 필요한 정보가 부족합니다.

KVO는 모두 물체의 속성을 관찰하는 것입니다. 그들이 파괴되기 전에 관찰을 중단해야만하는 경우를 제외하고 일반적으로 그들이 생성되거나 파괴 될 때주의를 기울여야합니다.

개체가 재미있을 때 개체를 시작하고 중지해야합니다. 문서에 정렬 된 모양의 배열이있는 그래픽 드로잉 패키지를 생각해보고 각 셰이프의 backgroundColor 속성을 관찰하는 데 관심이 있습니다.

Shape 인스턴스의 인스턴스화 및 할당 해제를 관찰하지는 않지만 대신 문서의 "shapes"속성을 관찰합니다. 이 관찰자를 통해 문서에 도형이 추가되거나 제거 될 때를 결정할 수 있습니다. 도형이 문서에 추가되면 우리는 그것을 관찰하기 시작합니다. 문서에서 제거되면 관찰이 중지됩니다. 문서에서 제거 될 수 있지만 실행 취소 스택에있는 경우 할당 취소되지 않을 수 있습니다.

모델의 개체 그래프에서 KVO를 사용하려면 개체를 추가 및 제거해야합니다 개체 그래프에서 KVO 호환 방식으로 관계 변이를 관찰 할 수 있고 해당 관찰자에서 관련 개체에 대한 속성 관찰자를 시작 및 중지 할 수 있습니다.

+0

당신은 그것을 Jim에게 못 박았습니다. 설명해 주셔서 감사합니다. 나는 인스턴스 자체를 관찰해야하는 객체의 인스턴스를 참조하는 ivar이라는 사실을 완전히 무시했습니다. 그리고 더 나아가 dot syntac - grandparent.parent.child를 사용하여 - 객체 그래프에서 어떤 것도 관찰 할 수 있습니다. 컬렉션을 관찰하기위한 KVO 패턴이 있다고 가정합니다. 그렇습니까? 2 엄지 손가락으로 짐. -Doug – dugla

+1

관계에 대한 특성을 준수합니다. 내 그림 응용 프로그램에서 "모양"속성을 관찰 할 것입니다. 문서 개체의 구현 자로서 _shapes ivar을 변경할 때마다 KVO와 호환되는 방식으로 처리해야합니다. NSKeyValueObserving.h를 통해 읽은 KVO 알림에서 관계의 변형을 래핑해야하며, 그러한 변형이 발생하면 관찰자 콜백에서 볼 수있는 정보는 무엇인지 알아야합니다. –

1

나는 당신이 CoreData 같은 것을 사용하지 않는 알림을 직접 게시해야합니다 생각합니다. CoreData를 사용하는 경우 NSManagedObject (저장된 모든 CoreData 객체의 루트 클래스)에는 -awakeFromInsert 메서드가 있습니다.이 메서드는 객체가 만들어져 ManagedObjectContext에 삽입 된 후에 호출됩니다.

파괴와 관련하여 -dealloc 메서드를 입력 할 때 바로 알림을 게시 할 수 있습니다.

0

나는 당신이 달성하고자하는 것이 정확히 무엇인지 모르겠다. 그래서 조금 더 설명하면 좋을 것이다.

관찰 된 개체가 할당 해제되기 전에 관찰자를 제거하려는 경우 KVO가 처리하므로 걱정할 필요가 없습니다. 알림을 사용하는 경우에도 문제가 발생하지 않으며 개체에서 알림을받지 않습니다.

여러 객체 (예 : 위젯 배열)를 관찰하고 객체 추가 또는 삭제시기를 알고 싶다면 KVO가이를 처리 할 수 ​​있습니다. 배열을 모델 객체에서 키로 만들고 KVO로 관측하면됩니다. 또한 KVO와 호환되는 방식으로 배열을 수정해야합니다 (예 : mutableArrayForKey : 또는 자신의 willChangeValueForKey 및 didChangeValueForKey 사용).

+0

감사합니다. Tom. 매우 도움이됩니다. 건배. – dugla

관련 문제