可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to get one instance of using NSNotificationCenter
with addObserver
and postNotificationName
but I can't work out why it won't work.
I have 2 lines to code to add the observer and send the message in 2 different classes
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil];
and
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
If I set the name to nil
it works fine becuase it's just a broadcast, when i try and define a notification name the messages never get through.
回答1:
All my code makes use of NSNotifications
like so:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];
The first one is registering the notification and the second posting of the notification.
回答2:
Basically it's all to do with the order of execution. If you've executed postNotificationName before addObserver, then this is an easy problem to have. Use breakpoints and step through the code :)
Your first breakpoint should stop here:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil];
Then here:
[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];
Also, make sure the selector has a colon on. Because it's method signature will be:
- (void)updateView:(NSNotification *)notification;
回答3:
I had the same problem.
The reason is that I called removeObserver method at
- (void)viewDidDisappear:(BOOL)animated{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:self];
}
So check whether if you had called removeObserver before postNotification.
回答4:
Change this:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
to this:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];
If your first notification is registered properly, newEventLoaded should be called.
回答5:
I had a similar issue and my problem was due to the notification being called on another thread. This solved my problem.
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});
回答6:
Have you tried any other names but @"Event" and nil? Just to be sure, you could define your event names in one file and include that into both notification registration and sending. For example:
Header file:
extern NSString * const NOTE_myEventName;
Source file:
NSString * const NOTE_myEventName = @"MyEventName";
Registration:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleMyEvent:)
name:NOTE_myEventName
object:nil];
Notification sending:
[[NSNotificationCenter defaultCenter]
postNotificationName:NOTE_myEventName object:nil];
回答7:
I successfully fixed my "NSNotification
not being sent when postNotificationName:
called" crash.
I found the real bug is in notification message handler.
The postNotificationName
and addObserver
are all right as the first post of this thread.