NSNotificationCenter Определение области действия - PullRequest
3 голосов
/ 23 августа 2011

Так что я новичок в NSNotifications, мне интересно, какова область применения. То есть Если у меня есть класс делегата приложения, и он является получателем уведомления:

-(id)init
{
    [ super init];
    if (!self) return nil;

    // Add to our notification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(receiveUpdateRequest:) 
                                                 name:@"RequestStatusUpdate"
                                               object:nil];
    return self;
}

И этот метод запускается при получении:

- (void) receiveUpdateRequest:(NSNotification *) notification
{
    // Check the Notification Name
    if ([[notification name] isEqualToString:@"RequestStatusUpdate"]){
        NSLog (@"Recieved Update Status!");
    }
    else {
        NSLog(@"Recieved Notification: %@",[notification name]);
    }

}

Могу ли я опубликовать уведомление так:

[[NSNotificationCenter defaultCenter] postNotificationName:@"RequestStatusUpdate" object:self];

Из другого экземпляра объекта где-нибудь в моем приложении?

Даже, например, объект, который создается в результате загрузки NIB:

summaryWindow   = [[SummaryWindowController alloc] initWithWindowNibName:@"SummaryWindow" owner:globalStatusController];

Нужно ли что-либо еще настраивать в моем классе summaryWindow, чтобы можно было вызывать метод postNotificationName.

Или, другими словами, глобальный [NSNotificationCenter defaultCenter] для всех экземпляров всех объектов в моем Приложении, я бы предположил, что это будет работать, но в настоящее время, когда я вызываю этот метод через IBAction в моем SummaryWindow, уведомление не кажется полученным.

Я протестировал [NSThread currentThread] и центр уведомлений по умолчанию, и похоже, что я нахожусь в потоке и в одном и том же центре уведомлений (который я считаю всегда глобальным). Я смотрю только на нить, так как она появляется в нескольких других темах.

2011-08-22 20:57:11.452 AppName[23102:1307] Using Default Notification Center: <CFNotificationCenter 0x10012c900 [0x7fff7d302ea0]>
2011-08-22 20:57:20.366 AppName[23102:1307] Using Default Notification Center: <CFNotificationCenter 0x10012c900 [0x7fff7d302ea0]>

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Ничего себе, это было хромым, я только что нашел [[NSNotificationCenter defaultCenter] removeObserver: self];в каком-то более раннем коде.У меня было это в dealloc, но кое-как удалось пропустить это в другом методе NSTask, над которым я работал.

0 голосов
/ 23 августа 2011

Или, другими словами, глобальный [NSNotificationCenter defaultCenter] для всех экземпляров всех объектов в моем Приложении

Да.

Я бы предположил, что так оно и будет работать, но в настоящее время, когда я вызываю этот метод через IBAction в моем SummaryWindow, уведомление, похоже, не получено.

Это потому, что вы регистрируетесь в init. Могу поспорить, что это Mac, а на Mac делегат приложения почти всегда создается из файла nib. Вы должны сделать эту работу в awakeFromNib.

Обратите внимание, что обычно вам не нужно проверять имя уведомления. Как правило, лучше использовать разные методы для каждого обратного вызова уведомления. Вы также должны всегда создавать строковую константу для имен уведомлений. Их слишком легко неправильно набрать.

...