iOS
NSNotificationCenter
Recherche…
Introduction
Les notifications iOS sont un moyen simple et puissant d’envoyer les données de manière souple. En d’autres termes, l’expéditeur d’une notification n’a pas à se soucier de savoir qui (le cas échéant) reçoit la notification, il la publie simplement sur le reste de l’application et elle peut être extraite par beaucoup de choses ou par rien. l'état de votre application.
Source : - HACKING avec Swift
Paramètres
Paramètre | Détails |
---|---|
prénom | Le nom de la notification pour laquelle enregistrer l'observateur; c'est-à-dire que seules les notifications portant ce nom sont utilisées pour ajouter le bloc à la file d'attente des opérations. Si vous omettez, le centre de notification n'utilise pas le nom d'une notification pour décider d'ajouter le bloc à la file d'attente des opérations. |
obj | L'objet dont l'observateur souhaite recevoir les notifications; c'est-à-dire que seules les notifications envoyées par cet expéditeur sont envoyées à l'observateur. Si vous ne transmettez aucune information, le centre de notification n'utilise pas l'expéditeur d'une notification pour décider de la remettre à l'observateur. |
queue | La file d'attente d'opération à quel bloc devrait être ajoutée. Si vous passez nil, le bloc est exécuté de manière synchrone sur le thread de publication. |
bloc | Le bloc à exécuter lors de la réception de la notification. Le bloc est copié par le centre de notification et (la copie) est conservé jusqu’à ce que l’enregistrement de l’observateur soit supprimé. |
Remarques
Un objet NSNotificationCenter (ou simplement un centre de notification) fournit un mécanisme de diffusion d'informations dans un programme. Un objet NSNotificationCenter est essentiellement une table de distribution des notifications.
Pour plus d'informations, consultez la documentation Apple ici
Ajouter un observateur
Convention de nommage
Les notifications sont identifiées par des objets NSString globaux dont les noms sont composés de cette manière:
Name of associated class
+ Did | Will
+ UniquePartOfName
+ Notification
Par exemple:
- 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)
Objectif c
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(testNotification:)
name:@"TestNotification"
object:nil];
PS: Il est également intéressant de noter que le nombre de fois qu'un observateur a été ajouté doit être exactement le nombre de fois que l'observateur est supprimé. Une erreur de débutant consiste à ajouter un observateur dans viewWillAppear:
d'un UIViewController, mais supprimer l'observateur dans viewDidUnload:
entraînera un nombre irrégulier de poussées et donc une fuite de l'observateur et le rappel du sélecteur de notification de manière superflue.
Supprimer des observateurs
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)
Objectif c
//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
Poster une notification
Rapide
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)
Objectif c
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];
Publication d'une notification avec des données
Rapide
let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)
Objectif c
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];
Observation d'une notification
Rapide
func testNotification(notification: NSNotification) {
let userInfo = notification.userInfo
let myObject: MyObject = userInfo["someKey"]
}
Objectif c
- (void)testNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}
Ajout / Suppression d'un observateur avec un bloc
Au lieu d'ajouter un observateur avec un sélecteur, un bloc peut être utilisé:
id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];
L'observateur peut alors être retiré avec:
[[NSNotificationCenter defaultCenter] removeObserver:testObserver
name:@"TestNotification"
object:nil];
Ajouter et supprimer un observateur pour le nom
// 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)