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

NSNotification & NSNotificationCenter in Swift

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)


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow