как использовать свойство объекта NSNotificationcenter

Может кто-нибудь показать мне, как использовать свойство объекта в NSNotifcationCenter. Я хочу иметь возможность использовать его для передачи целочисленного значения моему методу селектора.

Вот как я настроил прослушиватель уведомлений в своем представлении пользовательского интерфейса. Поскольку я хочу передать целочисленное значение, я не уверен, чем заменить nil.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveEvent:) name:@"myevent" object:nil];


- (void)receiveEvent:(NSNotification *)notification {
    // handle event
    NSLog(@"got event %@", notification);
}

Я отправляю уведомление из другого класса, как это. В функцию передается переменная с именем index. Именно это значение я хочу каким-то образом активировать в уведомлении.

-(void) disptachFunction:(int) index
{
    int pass= (int)index;

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:pass];
    //[[NSNotificationCenter defaultCenter] postNotificationName:<#(NSString *)aName#>   object:<#(id)anObject#>
}

person dubbeat    schedule 30.11.2010    source источник


Ответы (2)


Параметр object представляет отправителя уведомления, обычно это self.

Если вы хотите передать дополнительную информацию, вам нужно использовать метод NSNotificationCenter postNotificationName:object:userInfo:, который принимает произвольный словарь значений (который вы можете определить сами). Содержимое должно быть фактическим NSObject экземпляром, а не целочисленным типом, таким как целое число, поэтому вам нужно обернуть целочисленные значения объектами NSNumber.

NSDictionary* dict = [NSDictionary dictionaryWithObject:
                         [NSNumber numberWithInt:index]
                      forKey:@"index"];

[[NSNotificationCenter defaultCenter] postNotificationName:@"myevent"
                                      object:self
                                      userInfo:dict];
person gavinb    schedule 30.11.2010
comment
Я пошел по твоему варианту. Единственная дополнительная вещь, которую мне нужно было сделать, это обернуть пул авторелиза вокруг словаря. - person dubbeat; 30.11.2010
comment
(О, и мое решение такое же, как у Мэтью, мне просто удалось нажать «Отправить» немного быстрее!) - person gavinb; 02.12.2010
comment
Когда вы говорите обернуть пул автовыпуска вокруг словаря, вы имеете в виду, что добавили вызов для автоматического выпуска словаря или создали фактический объект NSAutoreleasePool? В последнем нет необходимости, если только вы не находитесь во вторичном потоке, а в первом нет необходимости для инициализаторов классов этой формы, так как он не инициализируется и не является новым. - person gavinb; 02.12.2010
comment
Также имейте в виду следующее, когда вы устанавливаете объект: Имя и параметры объекта обоих методов используются, чтобы решить, соответствуют ли критерии опубликованного уведомления наблюдателю. Если установлено имя, будут срабатывать только уведомления с этим именем, но если установлено nil, то будут совпадать все имена. То же самое и с объектом. Таким образом, если установлены и имя, и объект, будут срабатывать только уведомления с этим именем и указанным объектом. Однако, если и имя, и объект равны нулю, то будут срабатывать все опубликованные уведомления. – nshipster.com/nsnotification-and-nsnotificationcenter - person Sinisa Drpa; 05.12.2016

Свойство object для этого не подходит. Вместо этого вы хотите использовать параметр userinfo:

+ (id)notificationWithName:(NSString *)aName 
                    object:(id)anObject 
                  userInfo:(NSDictionary *)userInfo

userInfo, как видите, это NSDictionary специально для отправки информации вместе с уведомлением.

Вместо этого ваш метод dispatchFunction будет выглядеть примерно так:

- (void) disptachFunction:(int) index {
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:index] forKey:@"pass"];
   [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:nil userInfo:userInfo];
}

Ваш метод receiveEvent будет примерно таким:

- (void)receiveEvent:(NSNotification *)notification {
    int pass = [[[notification userInfo] valueForKey:@"pass"] intValue];
}
person Matthew Frederick    schedule 30.11.2010
comment
Свойство объекта не подходит для этого. Почему это не подходит? В любом случае, если я попытаюсь использовать свойство объекта для передачи (например) NSString*. Что случится? - person Selvin; 14.04.2013
comment
@Selvin Это для отправки объекта, публикующего уведомление (вы должны установить его на self, если хотите его использовать). Что произойдет, если вы поместите туда что-то еще? Я понятия не имею, но если бы мне пришлось угадывать, это могло бы испортить вещи, происходящие под прикрытием, например, Центр уведомлений, отслеживающий, что нужно выпустить. Зачем рисковать, когда есть реальная система передачи предметов? - person Matthew Frederick; 15.04.2013
comment
Объект NSNotification (называемый уведомлением) содержит имя, объект и необязательный словарь. Имя — это тег, идентифицирующий уведомление. Объект — это любой объект, который отправитель уведомления хочет отправить наблюдателям этого уведомления — обычно это объект, опубликовавший само уведомление. Словарь может содержать дополнительную информацию о событии. Мне кажется, было бы совершенно нормально поместить что-то кроме self и nil в object:. - person max; 19.09.2013
comment
@mdorseif обычно объект, который опубликовал само уведомление, поэтому это не лучшее место. Как правило, это то место, куда вы помещаете вызывающего абонента. Ничего не сломает, но это нестандартно, так зачем это делать, когда есть прекрасное место для размещения данных? Зачем заставлять себя в будущем или какую-то другую бедную душу задаваться вопросом, почему self вызывающего абонента находится не в объекте, которому он принадлежит, а в каких-то других случайных данных. - person Matthew Frederick; 15.11.2014
comment
Мы почти всегда использовали параметр объекта для отправки данных, так как получатель уведомления абсолютно не заинтересован в отправителе, и нет связи между отправителем и получателем (т. е. получателю не нужно знать что-либо о ключи в произвольном словаре userInfo). Я считаю, что в более современном мире Swift и безопасности типов словари такого рода являются анахронизмом - может быть, есть случай для более современных, безопасных для типов уведомлений, основанных на имени уведомления? - person SomaMan; 18.03.2021