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.

Answers


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 following url will solve your problem.

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_nsnotificationcenter


Need Your Help

Subtract a value from every number in a list in Python?

python python-3.x

I'm still reading the Python 3.1.3 tutorial and encountered the following problem: