'keypath'에 해당되는 글 1건

  1. 2014.04.07 Objective-c KVO 샘플 구현하기

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"];

    }




의외로 유용하게 쓸일이 많은 기능이다.



Posted by 악당잰 트랙백 0 : 댓글 0

댓글을 달아 주세요