Статьи

iOS SDK: NSNotification

В сегодняшнем кратком совете вы узнаете о классе NSNotification при создании демонстрационного проекта для отслеживания изменений в ориентации устройства. Давайте начнем!

Заказ из продовольственной корзины очень похож на работу с NSNotification . Вы подходите к прилавку, оформляете заказ, получаете номер и ждете, когда вам позвонят. Вы обычно стоите рядом с пятью другими людьми, которые ждут, чтобы их номер был также назван. И когда шеф-повар заканчивает готовить еду, человек за стойкой набирает ваш номер, и вы садитесь есть. С NSNotification вы становитесь наблюдателем «своего номера», а когда объект, NSNotificationCenter уведомление, NSNotificationCenter « NSNotificationCenter еду», NSNotificationCenter вызывает ваш номер, чтобы вы могли прийти и получить «еду». В этом уроке вместо ожидания еды мы будем ждать поворота устройства, а затем отправлять текущую ориентацию наблюдателю. Мы поговорим о том, как зарегистрироваться, чтобы получать уведомления, публиковать уведомления и передавать строковый объект вместе с уведомлением, используя userInfo .


Запустите Xcode и нажмите «Файл»> «Создать»> «Проект». Выберите приложение iOS Single View и нажмите «Далее». Назовите свой продукт «Уведомления» и введите имя для своего идентификатора компании, например, «com.companyName.notifications». Выберите семейство устройств iPhone и нажмите «Далее». Выберите место для хранения вашего проекта и нажмите «Создать».


Объявите методы, используемые для публикации и получения уведомления, введя следующий код в файле «ViewController.m».

1
2
3
4
@interface ViewController ()
    — (void)postNotificationWithString:(NSString *)orientation;
    — (void)useNotificationWithString:(NSNotification*)notification;
@end

Теперь мы можем зарегистрировать объект ViewController для получения уведомлений. Введите следующий код в метод viewDidLoad .

1
2
3
4
5
6
7
NSString *notificationName = @»MTPostNotificationTut»;
 
[[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(useNotificationWithString:)
    name:notificationName
    object:nil];

Существует четыре важных части метода addObserver:selector:name:object: Аргумент для addObserver: это объект, который хочет знать, когда происходит определенное уведомление. Аргумент для selector: это метод, который вызывается при получении уведомления. Аргумент для name: это название уведомления, о котором хочет знать наблюдатель; оно должно быть уникальным. Последним элементом метода является object: Его аргументом является объект, прикрепленный к уведомлению, и он часто равен nil зависимости от контекста уведомления.


Далее мы сгенерируем логику для отправки уведомления. Введите следующий код в файле «ViewController.m». Пользовательский метод postNotificationWithString: ранее объявленный принимает один аргумент, представляющий ориентацию устройства.

1
2
3
4
5
6
7
— (void)postNotificationWithString:(NSString *)orientation //post notification method and logic
{
    NSString *notificationName = @»MTPostNotificationTut»;
    NSString *key = @»OrientationStringValue»;
    NSDictionary *dictionary = [NSDictionary dictionaryWithObject:orientation forKey:key];
    [[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil userInfo:dictionary];
}

Существует три важных части метода postNotificationName:object:userInfo: Аргумент для postNotificationName: является заголовком уведомления, которое было зарегистрировано в предыдущем addObserver:selector:name:object: method. Аргумент для object: снова является объектом, отправляющим уведомление, и в этом случае равен nil . Аргументом для userInfo является NSDictionary который можно использовать для отправки дополнительной информации с уведомлением. userInfo может быть nil , но в этом случае мы хотим знать ориентацию устройства. Для отправки с уведомлением информация упакована в словарь.

Чтобы получить ориентацию устройства, переопределите метод willAnimateRotationToInterfaceOrientation:duration: введя следующий код внутри фигурных скобок. Каждый раз, когда устройство поворачивается, postNotificationWithString: метод postNotificationWithString: и он переходит в «Портрет» или «Пейзаж» в зависимости от ориентации устройства.

1
2
3
4
5
6
7
8
9
— (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    if (interfaceOrientation == UIInterfaceOrientationPortrait) {
        [self postNotificationWithString:@»Portrait»];
    }
    else {
        [self postNotificationWithString:@»Landscape»];
    }
}

Пользовательский метод useNotificationWithString: был объявлен ранее и зарегистрирован как селектор, вызываемый при получении уведомления. Введите следующий код, который получает строку ориентации устройства из userInfo . Используя NSLog для отображения его значения, каждое изменение ориентации регистрирует, что было опубликовано другое уведомление.

1
2
3
4
5
6
7
— (void)useNotificationWithString:(NSNotification *)notification //use notification method and logic
{
    NSString *key = @»OrientationStringValue»;
    NSDictionary *dictionary = [notification userInfo];
    NSString *stringValueToUse = [dictionary valueForKey:key];
    NSLog(@»Device orientation —> %@»,stringValueToUse);
}

Наконец, наблюдатель должен быть удален, когда объект освобожден. Введите следующий код в методе dealloc :

1
2
3
— (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Если вы не используете ARC , вам также нужно явно вызвать [super dealloc] , например так:

1
2
3
4
— (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

Выберите «Продукт»> «Выполнить» или нажмите стрелку «Выполнить» в верхнем левом углу. Если вы используете симулятор iOS, нажмите «Оборудование»> «Повернуть влево» для имитации вращения устройства. Обратите внимание, что «Ориентация устройства -> Пейзаж» записывается в консоль.


Методы запуска в отключенных объектах потребовали бы некоторого здоровенного кодирования без уведомлений и NSNotificationCenter . Добавляя наблюдателей для прослушивания определенных сообщений в центр уведомлений, ваши объекты могут легко общаться и передавать данные.