Come notificare messaggi con NSNotificationCenter

Objective-C

Spesso è necessario avvisare uno o più oggetti che è accaduto qualcosa. Ad esempio che è stato caricato un file oppure che una routine ha finito di eseguire il suo lavoro Objective-C ci da in aiuto NSNotificationCenter e NSNotification.

Il loro concetto è semplice, NSNotificationCenter si occupa di registrare un oggetto per una deteminata notifica.
Quando un altro oggetto andrà a postare questa notifica, NSNotificationCenter invierà un messaggio a tutti gli oggetti che si sono registrati.

Ecco un esempio di utilizzo.
Assumiamo che il nostro ViewController ha un oggetto di tipo Foo chiamato foo (che fantasia è!) che invia una notifica appena finisce di eseguire del codice.

Nel nostro ViewController scriviamo:

- (void)viewDidLoad {
[super viewDidLoad];

Foo* foo = [Foo new]; // oggetto fittizio

NSString* notificationName = @"TEST_NOTIFICATION";
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationDidPost:) name:notificationName object:foo];

[foo doCode];
}

e poi aggiungere il metodo:

- (void)notificationDidPost:(NSNotification*)notification {
NSLog(@"Notification post: %@", notification);
}

Mentre nell’oggetto foo che vuol inviare la notifica inserire:

- (void)doCode {
[[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:self];
}

Ricordatevi che quando registrate un oggetto a NSNotificationCenter dovete anche rimuoverlo dalla registrazione, quindi nel -dealloc dell’oggetto registrato inserite:

[[NSNotificationCenter defaultCenter] removeObserver:self name:notificationName object:foo];

in alternativa potete anche inserire:

[[NSNotificationCenter defaultCenter] removeObserver:self];

che rimuoverà tutte le registrazioni di questo oggetto.

Curiosità:

UIViewController cancella automaticamente le registrazioni a NSNotificationCenter, quindi per questo tipo di oggetto e per tutte le sue sottoclassi potete saltare questo passo.

Scritto il