NSNotificationCenter范围定义

时间:2011-08-22 20:34:33

标签: objective-c cocoa scope nsnotifications nsnotificationcenter

所以我是NSNotifications的新手,我想知道范围是什么。即如果我有一个Application Delegate Class,它是通知的接收者:

-(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];

从我的App中的任何位置的另一个对象实例?

即使是例如由于加载了NIB而实例化的对象:

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

我是否必须在summaryWindow类中配置其他任何内容才能调用postNotificationName方法。

或者对于我的应用程序中所有对象的所有实例,[NSNotificationCenter defaultCenter]全局采用不同的方式,我会假设它是如何工作的,但是当我在SummaryWindow中通过IBAction调用此方法时,通知似乎没有收到。

我已经测试了[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 个答案:

答案 0 :(得分:2)

哇哇哇哇,我刚刚发现[[NSNotificationCenter defaultCenter] removeObserver:self];在一些早期的代码中。我在dealloc中得到了它,但有些人在我正在研究的另一种NSTask方法中设法错过了它。

答案 1 :(得分:0)

  

对于我的应用程序中所有对象的所有实例,[NSNotificationCenter defaultCenter]全局采用不同的方式

  

我会假设它是如何工作的,但是当我在SummaryWindow中通过IBAction调用此方法时,通常似乎没有收到通知。

那是因为你在init注册了。我敢打赌这是Mac,而在Mac上,应用程序委托几乎总是从nib文件中实例化。您需要在awakeFromNib

中完成此项工作

请注意,您通常无需检查通知的名称。通常最好为每个通知回调设置不同的方法。您还应始终为通知名称创建字符串常量。错误输入它们太容易了。