ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 3

18. Уведомления (Notifications)

Центр уведомлений (NSNotificationCenter)

NSNotificationCenter — это один из механизмов передачи уведомлений. Во многих случаях он может быть успешной заменойделегированию. Центр уведомлений имеет два основных преимущества:

 

— нет необходимости проверять валидность объекта, который принимает сообщение;

— сообщение может быть послано сразу несколькиим объектам.

 

Чтобы более конкретно разобраться в работе NSNotificationCenter предлагаю воспользоваться кодом с примера Более детально о навигации (в нем уже создано несколько классов над которыми мы и будем ставить эксперименты).

 

Вся работа с центром уведомлений делится на несколько этапов:

 

1. Регистрация уведомления

2. Посылание уведомления

3. Удаление регистрации

 

В нашем случае уведомления будет принимать класс RootViewController. Для этого зарегистрируем его в центре уведомлений (изменим метод viewDidLoad):

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Main page";

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(didGetMyNotification)
                                                 name:@"MyNotification"
                                               object:nil];
}</code>

 

Observer — это объект, который будет принимать уведомление.

selector — это метод, который будет вызван в момент приемки уведомления.

name — имя уведомления.

object — это объект, который отправил уведомление (на тот случай, если вы хотите получать это уведомление от конкретных объектов).

 

Чтобы избежать ситуации, когда сообщение будет послано несуществующему классу — следует отписаться от регистрации. Делать это лучше всего в методе dealloc:

 

<code data-result="[object Object]">- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [super dealloc];
}</code>

 

Добавьте этот метод в файл RootViewController.m (или измените, если он там уже был). В этот же файл следует добавить тот самый метод didGetMyNotification, который мы указывали при регистрации в центре уведомлений.

 

<code data-result="[object Object]">- (void)didGetMyNotification {
    NSLog(@"Hello!");
}</code>

 

Класс RootViewController готов к приему уведомлений. Теперь приступим к отправке. Для чистоты эксперимента предлагаю возложить обязанности отправки сообщений на класс PageFiveViewController (создавать в нем делегат и передавать ссылку RootViewController мы не будем). Добавим в реализацию класса PageFiveViewController метод pressHello (так же, добавим на интерфейс кнопку и свяжем нажатие на нее с вызовом этого метода).

 

<code data-result="[object Object]">- (IBAction)pressHello {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:nil];
}</code>

 

В параметре postNotificationName мы указали имя нашего уведомления, а в object — пустое значение. Если все сделано правильно — при нажатии на новую кнопку в PageFiveViewController.xib в консколь бует выведено сообщение «Hello!«.

 

Для передачи значений в уведомлении следует воспользоваться параметром object, метода postNotificationName (который мы оставили пустым):

 

<code data-result="[object Object]">- (IBAction)pressHello {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:@"Hello Notification"];
}</code>

 

Но теперь следует изменить регистрацию на уведомление:

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Main page";

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(didGetMyNotification:)
                                                 name:@"MyNotification"
                                               object:nil];
}</code>

 

Здесь мы просто в селекторе добавили двоеточие, это значит, что наш метод будет принимать какие-то значения. А сам метод didGetMyNotification должен выглядеть так:

 

<code data-result="[object Object]">- (void)didGetMyNotification:(NSNotification*)notification {
    NSLog(@"%@", [notification object]);
}</code>

 

Исохдный код этого проекта можно скачать здесь.

Comments are closed.