Objective-c에서 KVO를 구현해야 할 경우가 있어 메모해 둔다.
KVO를 간단히 설명하자면 오브젝트의 값(프로퍼티)를 감시하여 이벤트를 받을 수 있는 기능이다.
감시할때 감시하는 옵션에는 여러가지가 있으나 그중 제일 많이 사용하는 값변경에 대한 감시이다.
값을 감시할 때.
// NSYunjiClass의 인스턴스 생성하여 "onAir"의 값을 감시할 경우에는
NSYunji *yunjilove = [[NSYunji alloc] init];
[yunjilove addObserver:self forKeyPath:@"onAir" options:NSKeyValueObservingOptionNew context:nil];
감시값이 변경될경우 콜백 되는 메소드
//값이 변경되었을때 콜백되는 메소드
- (void)observerValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context
{
NSLog(@"keyPath:[%@] change:[%@]",keyPath, [change description]);
//변화한 값을 판별
if ([keyPath isEqual:@"onAir"]) {
//처리할 내용을 코딩.
}
}
파라메터 설명
keyPath 갑시할 키.(프로퍼티)
object 감시대상 오브젝트 (NS윤지러브)
change 변화한 값정보.
context 임의의 오브젝트 nil
(여기서 context는 nil을 넣어주면된다. 감시자에게 참조값을 전달할 수 있다는데 지금 설명에서는 패스.)
값 감시 삭제할 때.
감시(Observer)를 했으면 반드시 삭제를 해야 한다. 물론 중복해서 삭제를 하거나 하면 에러가 발생하므로 요주의.
[yunjilove removeObserver:self forKeyPath:@"onAir"];
수동통지 할때.
감시대상이 된 프로퍼티는 전부 통지되므로 통지가 많아지는 경우가 발생한다.
이 경우엔 해당 프로퍼티를 수동통지로 바꾸어서 한번에 통지하던지 하는 방법도 가능하다.
수동으로 통지하는경우에는 automaticallyNotiviesObserversForKey: 메소드를 실행하여 수동통지 되도록 코딩해 준다.
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey
{
BOOL automatic = NO;
if ([theKey isEqualToString:@"onAir"]) {
automatic = NO;
}
else {
automatic = [super automaticallyNotifiesObserversForKey:theKey];
}
return automatic;
}
덛붙여,willChangeValueForKey: didChangeValueForKey: 의 메소드를 setter에다가 구현해 줄 필요가 있다.
수동통지를 구현하는 setter메소드
- (void)setOnAir:(NSString *)onAir
{
[self willChangeValueForKey:@"onAir"];
_onAir = onAir;
[self didChangeValueForKey:@"onAir"];
}
의외로 유용하게 쓸일이 많은 기능이다.
'코딩(プログラミング)' 카테고리의 다른 글
(Objective-C) EventKit을 사용한 캘린더 등록 및 표시하는 방법 (0) | 2014.05.08 |
---|---|
Objective-C에서 NSData의 형변환 (0) | 2014.04.30 |
Objective-c KVO 샘플 구현하기 (0) | 2014.04.07 |
아이폰에서 차트나 그래프를 그릴려면? (0) | 2014.03.29 |
AutoLayout 에서 frame조정이 안되는 문제 해결방법 (스크롤뷰 문제포함) (0) | 2014.03.08 |
맥에서 구글앱엔진 파이썬 개발환경설정 (2) | 2014.02.02 |
댓글을 달아 주세요