KVC/KVO 는 Apple Framework에서 중요한 부분을 담당한다. 한번 공부해보자.
Background
03. Operation Queue에서 간단하게 알아보았던 적이 있다.
일단 왜 이 개념이 나왔는지에 대해서 이해하기 위해서는 Objective C가 필요하다. MVC 패턴이 최고라고 여겨질 시기.. Controller의 역할은 Model과 View의 Sync를 맞추는 것이었다. 이러한 과정에서 Controller가 해야하는 일은 두가지이다.
- Model의 변화를 View에 반영한다.
- View의 Interaction을 바탕으로 Model에 반영한다.
이러한 과정에 있어서 상태값을 결국 동기화해주는 문제에 직면하게 된다. Action이 일어날 때마다 이를 일일히 업데이트해주기 보다는 묶어서 서로 업데이트하도록 해두면 편하지 않을까? 이러한 점에서 Objective C 시절 나온 개념이라고 이해하면 된다.
Key Value Coding
문자열 식별자를 사용하여 객체의 프로퍼티에 간접적으로 액세스하기 위한 메커니즘
위의 문제 배경으로 부터 이를 해결하기 위해 첫번째 개념이 등장한다.
KVC는 NSKeyValueCoding이라는 protocol을 사용한다. 이 protocol은 접근자 getter와 setter를 제공한다. 이 protocol에서 제공하는 setter를 사용해야, observer들에게 값을 보낼 수 있다.(KVO와 연결)
- getter Method
valueForKey:valueForKeyPath
- setter Method
setValue:forKey:setValue:forKeyPath
Key로 들어가는 녀석들은 특정 규칙이 있다.
- ASCII Encoding이어야 한다.
- 소문자로 시작해야 한다.
- 공백이 없어야 한다.
id address = [person valueForKey:@"address"];
id town = [address valueForKey:@"town"];Key를 가지고 객체의 값을 가져오는 예제이다. 보면 객체의 property에 직접 접근(ObjectInstance.property)하지 않고 문자열을 통해서 값을 가져오는 것을 확인할 수 있다.
id town = [person valueForKeyPath:@"address.town"];다음은 KeyPath를 사용한 예제이다. 차이점을 알겠는가? 인스턴스에 직접 접근하지 않고, .을 포함한 문자열을 통해 간접적으로 property를 가져오고 있다.
Key Value Observing
다른 객체의 특정 프로퍼티에 대한 변경 사항을 알림 받을 수 있는 메커니즘
KVO는 KVC를 기반으로 하고 있다. 즉, 특정 값을 관찰하는데 있어서 KVC를 사용한다는 것이다. 그렇다면 어떻게 Observing할 수 있는지, remove할 수 있는지만 알면 된다.
[self addObserver:self
forKeyPath:@"someView.frame"
options:0
context:NULL];위의 예는 특정 View의 frame 값을 observing 하는 코드를 적어둔 것이다. KeyPath를 사용하여 값을 관찰할 수 있다.
[self removeObserver:self forKeyPath:@"someView.frame"];사용이 끝난 시기에 지워주는 것도 잊지 말아야 겠다.