Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 885
Infinity James Avatar asked Nov 15 '12 13:11

Infinity James


People also ask

How do I add alerts to observer?

First, register an observer for a notification with: addObserver(_:selector:name:object:) Then, post a notification with post(name:object:userInfo:) … … after which your selector is called. And don't forget to remove the observer with removeObserver()

What is notification observer?

Observer — This is for the class where we are going to observer notification. Selector — This is the method name, whenever notification will receive this method call. Notification.Name — This is the Notification key and this should be unique for any new Notification register method.

Do we need to remove observer Swift?

If your app targets iOS 9.0 and later or macOS 10.11 and later, and you used addObserver(_:selector:name:object:) , you do not need to unregister the observer. If you forget or are unable to remove the observer, the system cleans up the next time it would have posted to it.


1 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.

enter image description here

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.

like image 150
Dinesh Raja Avatar answered Sep 22 '22 12:09

Dinesh Raja