[iOS] NSNotificationCenter 사용법

2013. 12. 5. 12:00Scrapbook/개발 및 프로그래밍

반응형

간편로그인을 구현하면서

NSNotificationCenter 가 사용되었는데 사용법을 몰라 헤메다 좋은글을 발견했다.

문제가 유발되었던부분은 옵저버를 제거해주지 않아 발생된 다중 Noti ...

 

아래글에서

노티피케이션은 옵저버나 옵저버가 관심있는 객체를 리테인하지 않기 때문에 사용 후에는

노티피케이션센터에 등록된 옵저버를 제거 해주어야 합니다.

메모리를 해제해주는 dealloc 메서드에 [[NSnotificationCenter defaultCenter] removeObserver:self];를 추가하면 됩니다.

는 아주 중요한 내용이다.

 


-일반적인 노티피케이션 사용법-

:노티피케이션 센터에 등록을 해서 사용

 

1.     노티피케이션을 보내는 객체

// NSNotificationCenter 객체를 선언하여 defaultCenter에 등록

NSNotificationCenter *myNotificationCenter = [NSNotificationCenter defaultCenter];

 

// 노티피케이션을 보낼 때 같이 전송할 userInfo의 딕션너리 dic를 키값을 이용하여 저장

NSDictionary *dic = [NSDictionary dictionaryWithObject:(전송할 객체forKey:@firstKey];

 

// myNotificationCenter 객체를 이용하여 키값으로 어디든지 노티피케이션 전송 가능

[myNotificationCenter postNotificationName:@firstNotification” object:self userInfo:dic];

 

2.     노티피케이션을 받는 객체 (옵저버)

// myNotificationCenter 객체 생성 후 defaultCenter에 등록

NSNotificationCenter *sendNotification = [NSNotificationCenter defaultCenter];

 

// myNotificationCenter 객체를 이용해서 옵저버 등록firstNotification” 이름의 노티피케이션이

// 전송되면 노티피케이션을 받아 셀렉터를 이용하여 메서드 실행

[sendNotification addObserver:self selector:@selector(firstMethod:) name:@firstNotification” object: nil];

 

// 셀렉터를 이용하여 실행될 메서드

           -(void)firstMethod:(NSNotification *)notification {

                      // 노티피케이션을 보낼 때 사용했던 키값을 사용

                     id object = [[notification userInfoobjectForKey:@firstKey];

           }

 

이렇게 노티피케이션을 등록 후 사용하고자 하는 곳에서 post 해주시면 등록했을 때의

셀렉터가 지정한 메서드가 호출 되면서 정보값이 넘어갑니다.

노티피케이션은 옵저버나 옵저버가 관심있는 객체를 리테인하지 않기 때문에 사용 후에는

노티피케이션센터에 등록된 옵저버를 제거 해주어야 합니다.

메모리를 해제해주는 dealloc 메서드에 [[NSnotificationCenter defaultCenter] removeObserver:self];를 추가하면 됩니다.

 

-노티피케이션의 동기와 비동기-

지금까지 보셨던 NSNotificationCenter에게 노티피케이션을 전달하는 방식은 동기화 방식입니다.

postNotification: 메서드나 기타 다른 방법을 이용하여 노티피케이션을 전송하는 경우 센터에 등록되어 있는

모든 옵저버들에게 노티피케이션을 전송한 뒤에 postNotification: 메서드가 호출자코드에게 프로그램 제어를

반환하도록 되어 있습니다다시 말씀 드리자면해당 노티피케이션에 옵저버로 등록한 객체의 콜백 루틴이

수행 종료될 때까지 그 자리에서 가만히 대기하고 있게 됩니다병행성을 얻고자 한다면 다른 방식을 사용해야합니다.

 

이를 보완하기 위하여 다음과 같이 지연실행을 하는 방식이 있습니다.

-(void)tableViewSelectionDidChange:(NSNotification *)notification {

           [self performSelector:@selector(doComplexProcessing:) withObject:[notification object] afterDelay:0.0f];

}

 

메시지를 연기하는 방법보다 더 비동기화 된 기능은 NSNotificationQueue 클래스를 활용하는 것입니다.

이 클래스는 비동기식 FIFO 기능이 있으며 이 클래스가 제공하는

-(void)enqueueNotification:(NSNotification *)notification postingStyle:((NSPostingStyle)postingStyle coalesceMask:(NSUInteger)coalesceMask forModes:(NSArray *)modes

메서들 활용하면 노티피케이션을 큐의 맨 뒤에 삽입 후 호출자에게 반환하게 해줍니다.

 

사용법은 노티피케이션센터에 옵저버를 등록 후 post를 해주는 곳에서 postNotification: 메서드를 사용하지 않고

대신 [[NSNotificationQueue defaultQueueenqueueNotification:[NSNotification notificationWithName:@”노티피케이션이름”object:nil] postingStyle:NSPostWhenIdle];

을 사용 합니다.

 

빨간글씨로 되어 있는 PostingStyle의 값은 NSPostWhenIdle 이면 비동기 방식으로 NSPostNow 이면 동기 방식으로 노티피케이션을 날려줍니다.

 

 

출처 : http://inhome.tistory.com/44

반응형