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

ЖАНРЫ

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

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

Шрифт:

15.1. Отправка уведомлений

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

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

Решение

Создайте экземпляр класса NSNotification и широковещательно передайте его вашему приложению, воспользовавшись методом класса postNotification:. Вы можете получить экземпляр центра уведомлений, воспользовавшись его методом класса defaultCenter, вот так:

#import «AppDelegate.h»

NSString *const kNotificationName = @"NotificationNameGoesHere";

@implementation AppDelegate

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSNotification *notification = [NSNotification

notificationWithName: kNotificationName

object: self

userInfo:@{@"Key 1": @"Value 1",

@"Key 2": @2}];

[[NSNotificationCenter defaultCenter] postNotification: notification];

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Обсуждение

Объект

уведомления инкапсулируется в экземпляр класса 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";

Поделиться с друзьями: