iPhone - отправка сообщения «в эфир» для любого объекта слушателя - PullRequest
0 голосов
/ 15 июня 2011

Есть ли способ на iPhone для объекта, чтобы отправить сообщение без определенного объекта-получателя, и в другой объект, прослушать такие сообщения, которые могут прийти с объектами (параметрами), и сделать то, что нужно?

Я искал NSNotification, но не вижу, что мне делать.

Ответы [ 3 ]

1 голос
/ 15 июня 2011

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

В данном случае «фильтр»пара (имя уведомления, объект уведомления).Объект nil в фильтре эквивалентен любому объекту (объект уведомления игнорируется при сопоставлении).Имя обязательно.

Пример:

/* Subscribe to be sent -noteThis:
 * whenever a notification named @"NotificationName" is posted to the center
 * with any (or no) object. */
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(noteThis:)
           name:@"NotificationName"
         object:nil];

/* Post a notification. */
[nc postNotificationName:@"NotificationName" object:self userInfo:someDict];

/* Handle a notification. */
- (void)noteThis:(NSNotification *)note
{
   id object = [note object];
   NSDictionary *userInfo = [note userInfo];
   /* take some action */
}

Существует более современный API, использующий очереди и блоки, но я считаю, что старый API проще иллюстрировать и объяснять.

1 голос
/ 15 июня 2011

По сути, вы публикуете уведомление (NSNotification) в общий класс, NSNotificationCenter.Вот пример:

#define kNotificationCenter [NSNotificationCenter defaultCenter]
#define kNotificationToSend @"a notification name as a string"

//... Post the notification 

[kDefaultCenter postNotificationNamed:knotificationToSend withObject:nil];

Любой класс, который хочет слушать, добавляет себя как наблюдатель в центр уведомлений.Вы также должны удалить наблюдателя.

[kNotificationCenter addObserver:self selector:@selector(methodToHandleNotification) object:nil];

//... Usually in the dealloc or willDisappear method:

[kNotificationCenter removeObserver:self];

Вы можете сделать больше с центром уведомлений.См. документацию NSNotificationCenter для полной справки.

0 голосов
/ 15 июня 2011

Я думаю, NSNotification - это сам объект сообщения, который нужно отправить, чтобы прослушать отправленное, попробуйте NSNotificationCenter. У него есть одноэлементный объект, поэтому для отправки сообщения:

NSNotification *notificationObj;
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotification:notificationObj];

А другой класс слушает с помощью:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(method:) object:nil];

Убедитесь, что в классе есть method: метод. Вы можете иметь один параметр, который является NSNotification объектом, который отправляется ранее. У объекта NSNotification есть [notificationObj object, который вы можете получить как часть данных, отправленных классом отправителя. В качестве альтернативы вы можете использовать [notificationObj userInfo], если хотите, чтобы он был более структурированным.

Вы можете инициализировать notificationObj и адаптировать его к желаемому сообщению. Более подробную информацию о NSNotificationCenter, вы можете найти его

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html#//apple_ref/occ/cl/NSNotificationCenter

или для получения дополнительной информации о NSNotification самой

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotification_Class/Reference/Reference.html

...