Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

}

Обсуждение

Объект уведомления инкапсулируется в экземпляр класса NSNotification. Сам по себе объект уведомления практически ничего не представляет. Чтобы он был полезен, его нужно послать приложению с помощью центра уведомлений. Объект уведомления имеет три важных свойства.

• Имя. Это строка. Когда получатель начинает слушать уведомления, он должен указать имя интересующего его уведомления, как будет показано далее в этой главе. Если вы отправляете уведомление в созданный вами класс, убедитесь, что имя уведомления хорошо документировано. Еще

лучше импортировать символ этой строки в файл заголовка. Подобный пример мы рассмотрим чуть позже в этом разделе.

 Объект-отправитель. По желанию вы можете указать объект, являющийся отправителем уведомления. Обычно в таком качестве задается self. Но зачем же нужно указывать отправитель уведомления? Эта информация полезна для тех компонентов приложения, которые слушают уведомления. Допустим, в одном из ваших классов вы отправляете уведомление с именем MyNotification, а другой класс приложения отсылает уведомление с точно таким же именем. Когда элемент начинает слушать уведомление с именем MyNotification, получатель может указать, из какого источника ожидается интересующее его уведомление. Так, получатель может указать, что ему требуются все уведомления с именем MyNotification, поступающие от конкретного объекта, но не интересуют одноименные уведомления, приходящие от другого объекта. Таким образом, получатель действительно контролирует ситуацию. Хотя вы даже и можете при отправке уведомления указать вместо объекта-получателя nil, гораздо целесообразнее задавать данному свойству self, то есть имя объекта, отправляющего уведомление.

 Словарь с пользовательской информацией. Это словарный объект, который вы можете прикреплять к объекту уведомления. Затем получатель может считывать этот словарь, когда получает уведомление. Можно сказать, что в этом параметре удобно передавать получателям вашего уведомления дополнительную информацию.

См. также

Раздел 15.0.

15.2. Слушание уведомлений и реагирование на них

Постановка задачи

Требуется отреагировать на уведомление, посылаемое либо вашим приложением, либо системой.

Решение

Слушайте интересующее вас уведомление путем вызова метода addObserver: selector: name: object: стандартного центра уведомлений. Этот метод имеет следующие параметры:

• addObserver — объект, который должен отслеживать заданное уведомление. Поэтому, если речь идет о текущем классе, задайте здесь self, чтобы указать на актуальный экземпляр вашего класса;

• selector — селектор, который будет получать уведомление. Этот селектор должен иметь один параметр типа NSNotification;

• name — имя уведомления, которое вы хотите слушать;

• object — объект, который должен прислать вам уведомление. Например, если одноименные уведомления поступают сразу от двух объектов, то вы можете сузить круг интересующих вас уведомлений и слушать только те из них, которые приходят от объекта A, игнорируя при этом приходящие от объекта B.

Если вы больше не хотите получать уведомления, выполните метод экземпляра removeObserver:, относящийся к классу NSNotificationCenter. Это должно делаться лишь при условии, что центр уведомлений удерживает экземпляры объектов-слушателей. Если центр уведомлений продолжает удерживать экземпляр вашего класса после того, как он был высвобожден, могут возникать утечки памяти и ошибки. Поэтому убедитесь в том, что своевременно удаляете объект

из списка наблюдателей.

Обсуждение

Вся эта теория станет значительно более понятной, если пояснить на примере. Мы собираемся создать класс Person и добавить к нему два свойства: имя и фамилию. Оба этих свойства будут относиться к типу NSString. Затем в делегате нашего приложения мы собираемся инстанцировать объект типа Person. Но не будем задавать имя и фамилию этой персоны, а отошлем в центр уведомлений само уведомление и его пользовательский словарь. В этом пользовательском словаре уведомления запишем имя и фамилию как элементы типа NSString. В методе инициализации класса Person мы собираемся слушать уведомление, которое приходит от делегата приложения. Затем извлечем имя и фамилию из пользовательского словаря и зададим эти значения для соответствующих свойств объекта-персоны.

Вот заголовочный файл делегата нашего приложения:

#import <UIKit/UIKit.h>

/* Имя уведомления, которое мы собираемся послать */

extern NSString *const kSetPersonInfoNotification;

/* Ключ имени в словаре пользовательской информации уведомления */

extern NSString *const kSetPersonInfoKeyFirstName;

/* Ключ фамилии в словаре пользовательской информации уведомления */

extern NSString *const kSetPersonInfoKeyLastName;

@interface AppDelegate: UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;

@end

А вот реализация делегата нашего приложения:

#import «AppDelegate.h»

#import «Person.h»

NSString *const kSetPersonInfoNotification = @"SetPersonInfoNotification";

NSString *const kSetPersonInfoKeyFirstName = @"firstName";

NSString *const kSetPersonInfoKeyLastName = @"lastName";

@implementation AppDelegate

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

Person *steveJobs = [[Person alloc] init];

NSNotification *notification =

[NSNotification

notificationWithName: kSetPersonInfoNotification

object: self

userInfo:@{kSetPersonInfoKeyFirstName: @"Steve",

kSetPersonInfoKeyLastName: @"Jobs"}];

/* В настоящее время класс person слушает это уведомление. Этот класс

извлечет из уведомления информацию об имени и фамилии и задаст

собственные имя и фамилию, основываясь на информации, полученной

Поделиться:
Популярные книги

Рабы Парижа

Габорио Эмиль
Детективы:
прочие детективы
5.00
рейтинг книги
Рабы Парижа

Хранилище

Литтл Бентли
Фантастика:
ужасы и мистика
6.86
рейтинг книги
Хранилище

Сказки. От двух до пяти. Живой как жизнь

Чуковский Корней Иванович
1. Сочинения в двух томах
Детские:
сказки
7.00
рейтинг книги
Сказки. От двух до пяти. Живой как жизнь

Свидание в морге (Сборник)

Маклин Алистер
Бестселлер
Детективы:
прочие детективы
6.25
рейтинг книги
Свидание в морге (Сборник)

А зори здесь тихие… (сборник)

Васильев Борис Львович
100 главных книг
Проза:
военная проза
советская классическая проза
7.90
рейтинг книги
А зори здесь тихие… (сборник)

Ведется следствие

Измайлова Кира Алиевна
Детективы:
прочие детективы
8.73
рейтинг книги
Ведется следствие

Кодекс Охотника. Книга XXXIV

Винокуров Юрий
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIV

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Часовой: воин Ордена

Шторм Максим
2. Часовой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Часовой: воин Ордена

Ст. сержант. Назад в СССР. Книга 5

Гаусс Максим
5. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ст. сержант. Назад в СССР. Книга 5

Избранное

Носсак Ганс Эрих
Мастера современной прозы
Проза:
современная проза
5.00
рейтинг книги
Избранное

Рэдволл

Джейкс Брайан
1. Рэдволл
Детские:
сказки
7.00
рейтинг книги
Рэдволл

Ложе из роз

Симмонс Сюзанна
Любовные романы:
исторические любовные романы
7.00
рейтинг книги
Ложе из роз

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV