#cocoa-touch
#cocoa-touch
Вопрос:
У меня возникли проблемы с определением того, как определить, какой объект отправил уведомление.
Я подписываюсь на уведомление в объекте A:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name=@"ReceivedData" object:nil]
Я отправляю уведомление от объекта B:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReceivedData" object: self userInfo: dict];
Я получаю уведомление в объекте A:
- (void) receivedNotification: (NSNotification*) notification
{
// Method is hit fine, notification object contains data.
}
Как я могу определить, что именно объект B отправил данные, а не, например, объект C? Мне нужна ссылка на отправителя. Я не хочу добавлять отправителя к передаваемому объекту уведомления, поскольку я указываю отправителя при вызове уведомления в объекте B
Ответ №1:
У NSNotification
класса есть метод с именем object, который возвращает объект, связанный с уведомлением. Часто это объект, который отправил это уведомление.
- (void) receivedNotification: (NSNotification*) notification
{
...
id myObject = [notification object];
...
}
Комментарии:
1. Это именно то, что я хочу получить. Как мне получить это в получателе моего уведомления? Вы можете видеть в моем вопросе, что класс, отправляющий уведомление, включает object: self .
2. Вызовите
object
метод для вашего параметра уведомления.
Ответ №2:
Если вы хотите обрабатывать уведомления только из класса B, то вы указываете это как объект (который вы оставили как nil
) при подписке на уведомление.
С помощью nil
вы получаете уведомления от всех объектов, которые отправляют это конкретное уведомление.
Редактировать
Вы вызываете, [notification object]
чтобы узнать, какой объект отправил уведомление.
Комментарии:
1. Я не хочу ограничивать уведомления только классом B, я хочу идентифицировать отправителя уведомления. Не имеет значения, откуда оно поступает. Мне просто нужна ссылка на объект. Я планирую освободить объект от уведомления.
2. Какой смысл указывать
object: self
в объекте B, если я не могу получить эту информацию в получателе уведомления?