[iOS] KVC, KVO
KVC(Key-Value-Coding)
- 처음에 이름을 보고 NSDictionary나 JSON을 말하나 했음.
- 애플에 나온 설명을 조금 요약해 보면..
KVC은 NSKeyValueCoding비공식 프로토콜이 속성에 대한 간접 액세스를 제공하기 위해 채택한 활성화된 메카니즘이다. 객체는 일반적으로 NSObject상속 될 때 KVC을 채택한다.
- 일단 NSObject를 상속해야만 쓸수 있는듯 하다. 상속후 해당 클래스의 변수 접근시 “변수 이름”으로 접근이 가능하다.
@interface TestObj : NSObject @property NSString* testVal; @end . . TestObj *testObj = [TestObj new]; [testObj setValue:@"test" forKey:@"testVal"]; // 값 설정 NSLog([testObj valueForKey:@"testVal"]); // testVal 프로퍼티값을 얻어온다.
- 특정값에 따른 분기처리등을 할때 프로퍼티명을 매칭 시켜주면 유연한 코딩이 될듯하다.
KVO(Key-Value-Observing)
- 일반적으로는 NSNotification을 많이 쓰는것 같음.. KVO을 좀더 일찍 알았으면 좋았을 텐데..
- 등록한 객체의 Key가 변경 되는것을 감시함.(옵저버 패턴을 사용하기 쉽게 만들었음)
- 변수를 옵저빙하여 해당 변수에 변경이 일어날때 observeValueForKeyPath함수를 통하여 변경 결과를 필터링 할수 있음.(변수에 이벤트 필터를 설치한다고 생각하면 이해가 편하다.)
- KVO를 이용하여 Objective-C에서 MVVM패턴을 만들수 있을듯..
[testObj addObserver:self forKeyPath:@"testVal" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil]; // 옵저버 등록(이전값과 새로운값을 전부 얻어옴) -(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id>*)change context:(void*)context { if([keyPath isEqualToString:@"testVal"]) { NSLog(@"testVal:%@", change); } } [testObj removeObserver:self forKyPath:@"testVal"]; // 옵저버 해제
댓글남기기