Cocoa 와 Cocoa Touch 프레임웍의 이벤트 통지 메커니즘인 NSNotification 에 대해서 간략하게 알아보자.
1. NSNotification 이란?
1. NSNotification 이란?
다수의 객체들 사이에서 이벤트가 발생했음을 알리는 방식으로, 한 객체와 다른객체 간에 의존관계를 중계하는 클래스에
집중화시켜서 서로 간에 결합도를 느슨하게 할 수 있다. NSNotificationCenter, NSNotification, Observer 로 구성된다.
NSNotificationCenter는 객체들 사이에 이벤트 전달을 중계하는 역할을 하며, Observer는 이벤트가 발생하기를 기다리는 대상을
나타낸다. Observer 가 기다리는 이벤트에 대한 정보와 부가적인 데이터를 전달하기 위한 객체가 Notification 이다.
집중화시켜서 서로 간에 결합도를 느슨하게 할 수 있다. NSNotificationCenter, NSNotification, Observer 로 구성된다.
NSNotificationCenter는 객체들 사이에 이벤트 전달을 중계하는 역할을 하며, Observer는 이벤트가 발생하기를 기다리는 대상을
나타낸다. Observer 가 기다리는 이벤트에 대한 정보와 부가적인 데이터를 전달하기 위한 객체가 Notification 이다.
Observer 는 객체의 역할을 지칭하는 용어이며, NSObject를 상속하는 모든 클래스가 Observer 가 될수 있다.
푸시 메시지가 도착했을 때, 현재 화면에 상관없이 특정화면으로 전환하기 위해 사용하였다.
화면은 항상 (화면1 > 화면2 > 화면3) 순서로
네비게이션 이동이 이루어진다고 해보자. 푸시 이벤트는 UIApplicationDelegate 프로토콜을 구현하는 클래스에서
수신하면, 이곳에서 NSNotification 이벤트를 발생시킨다. 실행되고 있는 App이 현재 어떤 화면을 보여주고
있던지 이벤트를 수신하는 클래스에서는 연쇄적으로 Notification을 다음화면으로 전달하여 (화면1 > 화면2 > 화면3) 의 순서를 유지하며 화면 전환을 할 수 있다. (화면1 > 화면3으로 바로 전환해버리면 네비게이션 순서가 틀어져버림)
있던지 이벤트를 수신하는 클래스에서는 연쇄적으로 Notification을 다음화면으로 전달하여 (화면1 > 화면2 > 화면3) 의 순서를 유지하며 화면 전환을 할 수 있다. (화면1 > 화면3으로 바로 전환해버리면 네비게이션 순서가 틀어져버림)
이외에도 비동기 방식으로 동작하는 NSURLConnection에서 데이터 수신이 완료되면, 수신한 데이터를 전달할 때 NSNotification을
사용하면 클래스간에 참조를 가지고 있지 않아도 데이터를 쉽게 전달할 수 있다.
2.3 이벤트 발생시키기
* 부가적으로 전달해야할 데이터가 있을 경우 사용
2.4 등록된 observer와 Notification 제거
사용하면 클래스간에 참조를 가지고 있지 않아도 데이터를 쉽게 전달할 수 있다.
2. NSNotification 을 사용하기 위한 절차
① NSNotificationCenter에 Observer 와 Notification 등록
② Notification 포스팅
② Notification 포스팅
③ 처리
④ NSNotificationCenter 에서 Observer 와 Notification 제거
④ NSNotificationCenter 에서 Observer 와 Notification 제거
2.1 Notification 등록
NSNotificationCenter 의 클래스 메소드 defaultCenter를 사용하여 로컬 NotificatonCenter의 싱글턴 객체를 얻을 수 있다.
이 클래스에서 지원하는 메서드를 사용하여 Notification을 등록 할 수 있다. 인자 Observer는 이벤트 발생시 수신할 객체,
selector는 이벤트 수신시 수행할 메시지 selector, name은 이벤트의 이름, object는 이벤트를 발생시킬 객체이며, nil을 주면
이벤트를 발생시킬 객체의 종류에는 상관없이 이벤트를 수신한다
NSNotificationCenter *notifCenter = [NSNotificationCenterdefaultCenter]; [notifCenter addObserver:self selector:@selector(viewTrasitionToMyLostArticleList:) name:@"moveToPushList" object:nil];
위 문장은 다음과 같이 해석된다.
“ 어떤 object가 어떤 이름의 이벤트를 보내면, observer의 selector를 호출해줘”
2.2 Notification 메시지의 형태
Observer의 수신 메시지의 형태는 반드시 NSNotification* 타입의 인자 하나를 받아야 한다.
그렇지 않으면 unrecognized selector sent
에러가 발생한다.
에러가 발생한다.
(void)viewTrasitionToMyLostArticleList:(NSNotification*)notif { NSString *pushSeq = [[notif userInfo] objectForKey:@"pushSeq"]; // 의심분실물 목록뷰로 전환 }
2.3 이벤트 발생시키기
NSNotificationCenter의 다음과 같은 메소드를 사용하여 Notification을 발생시킬 수 있다.
* Notification을 직접 생성하여 전달 - 데이터 전달이 필요없을 경우
* Notification을 직접 생성하여 전달 - 데이터 전달이 필요없을 경우
(void)postNotification:(NSNotification*)notification;
* 부가적으로 전달해야할 데이터가 있을 경우 사용
(void)postNotification:(NSString*)notificationName object:(id)anObject userInfo:(NSDictionary*)userInfo
2.4 등록된 observer와 Notification 제거
NSNotificationCenter 등록되어 있는 observer와 notification은 사용후 메모리 절약을 위해 제거해주는 것이 좋다.
// notificationObserver와 동일한 참조의 모든 observer를 제거 (void)removeObserver:(id)notificationObserver // 송신자가 notificationSender로 등록된 notificationName으로 등록된 모든 observer 제거 (void)removeObserver:(id)notificationObserver name:(NSString *)notificationName object:(id)notificationSender
'프로그래밍 > iOS' 카테고리의 다른 글
애플 푸시 서비스 (0) | 2012.02.07 |
---|---|
푸시 메시지 포맷 (0) | 2012.02.07 |
아이폰 Document 폴더의 파일,폴더 리스트 보기 (0) | 2012.02.07 |
페이스북 담벼락과 연동되는 아이폰 앱 만들기 (2) | 2012.02.07 |
전국 광역시도 위도 경도 delta 값 (0) | 2012.02.07 |