开发者

NSNotificationCenter Scope definition

So I'm new to NSNo开发者_运维百科tifications, I am wondering what the scope is. I.e. If I have an Application Delegate Class, and it is the receiver of a notification:

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

And has this method run on receive:

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

}

Can I post a notification like so:

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

From another object instance any where in my App?

Even for instance an object that instantiated by virtue of a NIB being loaded:

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

Do I have to have anything else configured in my summaryWindow Class to be able to call the postNotificationName method.

Or put a different way is the [NSNotificationCenter defaultCenter] global for all instances of all objects in my Application, I would assume thats how its suppose to work but currently when I call this method via an IBAction in my SummaryWindow , the notification does not seemed to be received.

I have tested both [NSThread currentThread] and the default Notification center and it does look like I'm in the thread and the same notification center ( which I think is always global). I am only looking into the thread thing as its come up on a few other threads.

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


Wow that was lame, I just found [[NSNotificationCenter defaultCenter] removeObserver:self]; in some earlier code. I had it in dealloc but some how managed to miss it in another NSTask method I was working on.


Or put a different way is the [NSNotificationCenter defaultCenter] global for all instances of all objects in my Application

Yes.

I would assume thats how its suppose to work but currently when I call this method via an IBAction in my SummaryWindow , the notification does not seemed to be received.

That's because you're registering in init. I'm betting this is Mac, and on Mac the application delegate is almost always instantiated from a nib file. You need to do this work in awakeFromNib.

Note that you generally do not need to check the notification's name. It's generally best to have a different method for each notification callback. You should also always create a string constant for your notification names. It's way too easy to mis-type them.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜