37. 메시징 메커니즘의 알림 센터 전송(NSNotificationCenter)

간단한 소개


iOS는'동기화된'메시지 알림 메커니즘을 제공하여 관찰자가 메시지 센터에 등록하기만 하면 다른 대상이 보낸 메시지를 받아들일 수 있다. 메시지 발송자와 메시지 수용자는 서로 아무것도 모르고 완전히 결합할 수 있다.이런 메시지 알림 메커니즘은 임의의 시간과 대상에 적용될 수 있고 관찰자가 여러 개가 있을 수 있기 때문에 메시지는 방송의 성격을 가진다. 다만 관찰자가 메시지 센터에 등록한 후에 정보를 받아들일 필요가 없을 때 메시지 센터에 취소해야 한다. 이런 메시지 방송 메커니즘은 전형적인'Observer'모델이다.이 요구는 사실 실현되기도 쉽다.실행 중인 모든 응용 프로그램에는 NSNotificationCenter의 구성원 변수가 있는데, 그 기능은 공공 표시줄과 유사하다.대상 등록은 어떤 확실한 notification에 주목한다. (강아지 한 마리를 주운 사람이 있으면 나에게 말해라.)우리는 이 등록 대상들을observer라고 부른다.다른 대상들은 센터에 notifications를 보낼 것이다.center는 이 notifications를 등록된 모든 notification에 관심 있는 대상에게 전송합니다.우리는 이러한 notification을 보내는 대상을poster 메시지 메커니즘이라고 하는데 서버에 데이터를 요청하거나 제출하는 장면에 자주 사용된다. 서버와 성공적으로 상호작용한 후에 서버에서 되돌아오는 데이터를 처리하거나 응답 메시지를 보내는 등 메시지 메커니즘에 사용해야 한다.

특징


현재 에이전트, Block, 알림 센터를 비교해 보면 그들 세 사람은 모두 페이지의 값을 전달할 때 자주 사용하는 방법이지만 그들 사이에는 어떤 차이가 있을까?오늘 먼저 간단하게 알아보고 나중에 상세한 탐구문을 낼 것이다.알림 센터와 그들의 가장 큰 특징은 한 쌍이 넘는 메시지 전달을 할 수 있고 에이전트와 Block은 한 쌍의 전송 값에서 사용된다는 것이다.또한 알림 센터의 결합도가 낮아 사용하기에 더욱 유연하고 편리하다.주의: 그러나 그 이익도 주의해야 할 점을 가져왔다. 즉, 천만 시간 동안 그가 한 쌍의 많은 소식 메커니즘이라는 것을 기억하는 것이다.사용 중 절대 주의해야 할 것은 같은 사건을 위해 여러 개의 알림을 등록할 때 (특히 같은 페이지에 있지 않다는 것을 가리킨다), 그들이 실행할 시기를 주의하고, 알림을 취소하거나 관찰자를 제거하는 것을 잊었는지 확인해야 한다.

사용법


1. 관찰자 등록 정보 알림
// 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(personGetTheMessage:) name:kNotification_personGetTheMessage object:nil];
notificationObserver관찰자:selfnotificationSelector메시지 처리 방법명:personGetTheMessage:notificationName메시지 알림의 이름:kNotificationpersonGetTheMessagenotificationSender 메시지 발송자: 어떤 발송자의 알림을 받는지 표시하고, 네 번째 파라미터가nil이면 모든 발송자의 알림을 받습니다.
주:여기서 kNotificationpersonGetTheMessage는 미리 작성된 매크로를 정의합니다.
#define kNotification_personGetTheMessage @"Notification_personGetTheMessage"

2. 메시지 알림 보내기
// , ( )
NSDictionary *messageDict = [[NSDictionary alloc] initWithObjectsAndKeys:@"zhangSan",@"nsme",@"male",@"sex", nil];
//  ( )
Person *onePerson = [[Person alloc] init];

// 
// ,   objet   messageDict  
[[NSNotificationCenter defaultCenter] postNotificationName:kNotification_personGetTheMessage object:onePerson userInfo:messageDict];
notificationName 메시지 알림의 이름: kNotificationpersonGetTheMessagenotificationSender 메시지 발송자: onePersonnotificationUserInfo 메시지 발송 매개 변수 사전: 메시지 Dict
주: 여기에서 메시지 알림을 보낼 때 매개 변수인 Object와userInfo는nil일 수 있습니다. 이것은 사용자 정의입니다. nil로 선택할 수 있습니다. 이렇게 하면 다음에 알림을 실행하는 방법이 없을 때 매개 변수가 없습니다.
3. 관찰자 메시지 처리
- (void) personGetTheMessage:(NSNotification*)aNotification
{
    Person *onePerson = [aNotification object];
    NSDictionary *dict = [aNotification userInfo];

    NSLog(@"person = %@",onePerson);
    NSLog(@"messageDic = %@",dict);
}

NSNotification에서 받은 메시지 정보는 주로 다음과 같다. Name: 메시지 이름(kNotification personGetTheMessage)object: 전송된 발송자(onePerson)userInfo: 전송된 매개 변수 사전(messageDict)
4. 알림을 취소하고 메시지 관찰자가 iOS에서 ARC를 사용한 후에 NSNotification Observer를 제거하는 것을 표시하지 않아도 오류가 발생하지 않지만 이것은 성능과 메모리에 불리한 나쁜 습관이다.그리고 같은 알림을 다시 보내고 현재 ViewController가 창고에 있을 때 알림의 방법이 실행되면 위의 특징에서 말한 주의사항을 방해할 수 있습니다.따라서 페이지가 사라지면 반드시 메시지 관찰자를 제거해야 하며, 특수한 경우를 제외한다.
a. 개별 알림 로그아웃, 관찰자 제거
[[NSNotificationCenter defaultCenter] removeObserver:self name:kNotification_personGetTheMessage object:onePerson];

참고: 매개변수 notificationObserver는 삭제할 관찰자이므로 nil로 설정할 수 없습니다.
b. 전체 ViewController에 대한 알림이 로그아웃되고 관찰자가 제거됩니다(가장 좋은 방법).
-(void)dealloc 
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

주:removeObserver: 알림 센터에 저장된 스케줄러의 관찰자의 모든 입구를 삭제하고,removeObserver:name:object: 알림 센터에 저장된 스케줄러의 관찰자와 일치하는 입구를 삭제합니다.

좋은 웹페이지 즐겨찾기