[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"];  // 옵저버 해제
    

댓글남기기