简体   繁体   中英

NSNotificationCenter Observer Not Receiving Notification

I am aware of the standard reasons as to why a notification would not be received:

  • Deallocating or nullifying the registered object.
  • Removing the object as an observer.
  • Not registering as an observer.
  • Registering for the wrong notification or posting the wrong notification.

I can happily say that I am damn sure that none of these are happening. I suppose the most likely is that the object is at some point being nullified and recreated, but it registers for the notification upon initialisation.

Here is where I register:

/**
 *  initialises an object with a unique file url
 *
 *  @param  url                         the url to set as the file url
 */
- (id)initWithFileURL:(NSURL *)url
{
    if (self = [super initWithFileURL:url])
    {
        self.entries                    = [[NSMutableArray alloc] init];

        //  we want to be notified when a note has changed
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(noteChanged)
                                                     name:@"com.andbeyond.jamesvalaitis.notesChanged"
                                                   object:self];

        NSLog(@"Just registered for 'com.andbeyond.jamesvalaitis.notesChanged'");
    }

    return self;
}

Here is where I post the notification:

/**
 *  save the note content
 */
- (void)saveNote
{
    if (_isChanged)
    {
        //  save to the text view to the note's contents
        self.note.noteContent           = self.noteView.text;

        //  post a notification that we changed the notes
        [[NSNotificationCenter defaultCenter] postNotificationName:@"com.andbeyond.jamesvalaitis.notesChanged" object:nil];

        NSLog(@"Just posted 'com.andbeyond.jamesvalaitis.notesChanged'");

        //  make sure we know it's already saved
        _isChanged                          = NO;
    }
}

This is the method that is not being called:

/**
 *  called when a note has changed
 */
- (void)noteChanged:(NSNotification *)notification
{
    NSLog(@"Just received for 'com.andbeyond.jamesvalaitis.notesChanged'");

    //  save the notes
    [self saveToURL:self.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success)
    {
        if (success)
            NSLog(@"Note updated.");
    }];
}

This is the console clarifying that I both register and post the notification:

2012-11-15 13:27:50.958 iCloud Custom[11269:907] Just registered for 'com.andbeyond.jamesvalaitis.notesChanged'

2012-11-15 13:28:24.184 iCloud Custom[11269:907] Just posted 'com.andbeyond.jamesvalaitis.notesChanged'

The whole project can be found here.

I think I have figured out the answer. You are creating the notification in UIDocument file named NotesDocument.m . So when you create an observer, you set the object as self . That means the NotesDocument object . But when you post the notification , you are sending the object as nil . So it wont observe the notification as per documentation. Easy way to overcome this is you need set object as nil when creating a notification. Otherwise you need to pass an NotesDocument Object .

Check out the below image and parameter details for the addObserver method of notification.

在此输入图像描述

check out the notificationSender parameter .The object whose notifications the observer wants to receive; that is, only notifications sent by this sender are delivered to the observer.

Change the following:

...
selector:@selector(noteChanged:) 

...
- (void) noteChanged:(NSNotification *) notification
...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM