iOS
NSNotificationCenter
Ricerca…
introduzione
Le notifiche iOS sono un modo semplice e potente per inviare i dati in modo flessibile. Cioè, il mittente di una notifica non deve preoccuparsi di chi (se qualcuno) riceve la notifica, lo pubblica solo là fuori per il resto dell'app e potrebbe essere raccolto da un sacco di cose o nulla a seconda di lo stato della tua app.
Fonte : - HACKING con Swift
Parametri
Parametro | Dettagli |
---|---|
nome | Il nome della notifica per cui registrare l'osservatore; ovvero, solo le notifiche con questo nome vengono utilizzate per aggiungere il blocco alla coda delle operazioni. Se si passa a zero, il centro notifiche non utilizza il nome di una notifica per decidere se aggiungere il blocco alla coda operazioni. |
obj | L'oggetto di cui l'osservatore desidera ricevere le notifiche; cioè, solo le notifiche inviate da questo mittente vengono consegnate all'osservatore. Se si passa a zero, il centro di notifica non utilizza il mittente di una notifica per decidere se consegnarlo all'osservatore. |
coda | La coda di operazione a quale blocco deve essere aggiunto. Se si passa nil, il blocco viene eseguito in modo sincrono sul thread di registrazione. |
bloccare | Il blocco da eseguire quando viene ricevuta la notifica. Il blocco viene copiato dal centro di notifica e (la copia) trattenuto fino alla rimozione della registrazione dell'osservatore. |
Osservazioni
Un oggetto NSNotificationCenter (o semplicemente un centro di notifica) fornisce un meccanismo per la trasmissione di informazioni all'interno di un programma. Un oggetto NSNotificationCenter è essenzialmente una tabella di invio delle notifiche.
Per maggiori informazioni, consulta la documentazione Apple qui
Aggiunta di un osservatore
Convenzione di denominazione
Le notifiche sono identificate da oggetti NSString globali i cui nomi sono composti in questo modo:
Name of associated class
+ Did | Will
+ UniquePartOfName
+ Notification
Per esempio:
- NSApplicationDidBecomeActiveNotification
- NSWindowDidMiniaturizeNotification
- NSTextViewDidChangeSelectionNotification
- NSColorPanelColorDidChangeNotification
Swift 2.3
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(self.testNotification(_:)),
name: "TestNotification",
object: nil)
Swift 3
NSNotificationCenter.default.addObserver(self,
selector: #selector(self.testNotification(_:)),
name: NSNotification.Name(rawValue: "TestNotification"),
object: nil)
Objective-C
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(testNotification:)
name:@"TestNotification"
object:nil];
PS: Vale anche la pena notare che il numero di volte che un osservatore è stato aggiunto deve essere esattamente il numero di volte che l'osservatore viene rimosso. Un errore da principiante consiste nell'aggiungere l'osservatore nella viewWillAppear:
di un UIViewController, ma rimuovendo l'osservatore in viewDidUnload:
causerà un numero non uniforme di push e quindi la fuoriuscita dell'osservatore e del selettore di notifica che viene richiamato in modo superfluo.
Rimozione degli osservatori
Swift 2.3
//Remove observer for single notification
NSNotificationCenter.defaultCenter().removeObserver(self, name: "TestNotification", object: nil)
//Remove observer for all notifications
NotificationCenter.defaultCenter().removeObserver(self)
Swift 3
//Remove observer for single notification
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "TestNotification"), object: nil)
//Remove observer for all notifications
NotificationCenter.default.removeObserver(self)
Objective-C
//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
Pubblicazione di una notifica
veloce
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)
Objective-C
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];
Pubblicazione di una notifica con dati
veloce
let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)
Objective-C
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];
Osservando una notifica
veloce
func testNotification(notification: NSNotification) {
let userInfo = notification.userInfo
let myObject: MyObject = userInfo["someKey"]
}
Objective-C
- (void)testNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}
Aggiunta / rimozione di un osservatore con un blocco
Invece di aggiungere un osservatore con un selettore, è possibile utilizzare un blocco:
id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];
L'osservatore può quindi essere rimosso con:
[[NSNotificationCenter defaultCenter] removeObserver:testObserver
name:@"TestNotification"
object:nil];
Aggiungi e rimuovi l'osservatore per nome
// Add observer
let observer = NSNotificationCenter.defaultCenter().addObserverForName("nameOfTheNotification", object: nil, queue: nil) { (notification) in
// Do operations with the notification in this block
}
// Remove observer
NSNotificationCenter.defaultCenter().removeObserver(observer)