объект доступа передан в NSNotification? - PullRequest
23 голосов
/ 19 июля 2011

У меня есть NSNotification, который публикует NSDictionary:

 NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                          anItemID, @"ItemID",
                                          [NSString stringWithFormat:@"%i",q], @"Quantity",
                                          [NSString stringWithFormat:@"%@",[NSDate date]], @"BackOrderDate",
                                          [NSString stringWithFormat:@"%@", [NSDate date]],@"ModifiedOn",
                                          nil];

                    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"InventoryUpdate" object:dict]];

Как мне подписаться на это и получить информацию из этого NSDictionary?

по моему мнению, у меня есть:

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

и метод в классе:

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated", [notification userInfo]);
}

, который записывает нулевое значение курса.

Ответы [ 7 ]

34 голосов
/ 19 июля 2011

это [notification object]

Вы также можете отправить userinfo, используя notificationWithName:object:userInfo: метод

14 голосов
/ 19 июля 2011

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"Inventory Update" object:self userInfo:dict];

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

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

Далее используйте его в своем селекторе

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated", [notification userInfo]);
}
3 голосов
/ 03 июня 2016

Это просто, см. Ниже

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated",notification.object); // gives your dictionary 
    NSLog(@"%@ updated",notification.name); // gives keyname of notification

}

, если получить доступ к notification.userinfo, он вернет null.

2 голосов
/ 19 июля 2011

Вы делаете это неправильно.Вам нужно использовать:

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

и передать dict последнему параметру.Ваш параметр "object" - это объект, отправляющий уведомление, а не словарь.

1 голос
/ 19 июля 2011

object из уведомления предназначено для отправителя , в вашем случае словарь на самом деле не является отправителем , это просто информация. Любая вспомогательная информация, которая должна быть отправлена ​​вместе с уведомлением, предназначена для передачи вместе со словарем userInfo. Отправьте уведомление как таковое:

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
                                      anItemID, 
                                      @"ItemID",
                                      [NSString stringWithFormat:@"%i",q], 
                                      @"Quantity",
                                      [NSString stringWithFormat:@"%@", [NSDate date]], 
                                      @"BackOrderDate",
                                      [NSString stringWithFormat:@"%@", [NSDate date]],
                                      @"ModifiedOn",
                                      nil];

[[NSNotificationCenter defaultCenter] postNotification:
        [NSNotification notificationWithName:@"InventoryUpdate" 
                                      object:self 
                                    userInfo:dict]];

А затем получите это так, чтобы получить поведение, которое вы намереваетесь в хорошем смысле:

- (void)recieveInventoryUpdate:(NSNotification *)notification {
    NSLog(@"%@ updated", [notification userInfo]);
}
0 голосов
/ 20 марта 2019

Более простой способ -

-(void)recieveInventoryUpdate:(NSNotification *)notification
{
    NSLog(@"%@ updated",[notification object]);
    //Or use notification.object
}

Это сработало для меня.

0 голосов
/ 11 февраля 2017

Swift:

// Propagate notification:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: ["info":"your dictionary"])

// Subscribe to notification:
NotificationCenter.default.addObserver(self, selector: #selector(yourSelector(notification:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)

// Your selector:
func yourSelector(notification: NSNotification) {
    if let info = notification.userInfo, let infoDescription = info["info"] as? String {
            print(infoDescription)
        } 
}

// Memory cleaning, add this to the subscribed observer class:
deinit {
    NotificationCenter.default.removeObserver(self)
}
...