Comment utiliser le centre de notification

Swift 3 a apporté son lot de changement tant au niveau du langage que des APIs des différentes bibliothèques standard. Le NotificationCenter n’a pas été épargné par ces changements. Dans cet article nous allons vous expliquer succinctement comment envoyer / recevoir des notifications puis nous allons nous attarder sur la manière dont on doit désormais créer nos notifications personnalisées avec les Notification.Name.

Le centre de notification

Le centre de notification (NotificationCenter) est un objet statique fournit par la librairie standard d’iOS qui nous permet de poster / recevoir des messages. Cet objet est une implémentation du modèle de conception (Design Pattern) Notification pour communiquer de et vers plusieurs objets. C’est ce que l’on appel un paradigme de communication un-à-plusieurs (one-to-many) ou plusieurs-à-plusieurs (many-to-many).

Le système d’exploitation iOS utilise beaucoup le centre de notification pour permettre, à nous développeur, de réagir de manière adéquate aux différents évènements qui surviennent durant le cycle de vie d’une application. Par example, si l’on souhaite être avertis quand l’application perd le focus ou devient inactive on peut s’abonner à l’évènement .UIApplicationWillResignActive et inversement quand l’application redevient active ou retrouve le focus on peut s’abonner à l’évènement .UIApplicationDidBecomeActive (voir la section notification sur la documentation officielle) :

override func viewDidLoad() {
  super.viewDidLoad()

  let notificationCenter = NotificationCenter.default

  notificationCenter.addObserver(self, selector: #selector(applicationDidBecomeActive), name: .UIApplicationDidBecomeActive, object: nil)
  notificationCenter.addObserver(self, selector: #selector(applicationResignActive), name: .UIApplicationWillResignActive, object: nil)
}

@objc func applicationDidBecomeActive(notification: Notification) {
}

@objc func applicationResignActive(notification: Notification) {
}

Dans le viewDidLoad nous récupérons d’abord une référence vers le centre de notification, puis nous nous enregistrons aux deux évènements .UIApplicationDidBecomeActive et .UIApplicationWillResignActive avec la méthode addObserver(_:selector:name:object:), le tout en définissant l’objet et la méthode qui sera appelée à chaque fois que l’évènement sera posté au travers d’un sélecteur. Le dernier paramètre object est optionnel, il permet de filtrer les appels en fonction de la source.

Voici le code pour envoyer un message depuis le centre de notification :

notificationCenter.post(name: .UIApplicationDidBecomeActive, object: self, userInfo: nil)

On passe en paramètre de la fonction post(name:object:userInfo:) le Notification.Name,
et facultativement l’objet qui envoie la notification et aussi éventuellement des paramètres supplémentaire dans le userInfo.

L’example du dessus n’est pas très parlant car normalement cette notification ne devrait pas être envoyer par nous, mais par le système. Nous allons maintenant voir comment créer notre propre notification.

Créer ses notifications personnalisées

Pour créer ses propres notifications nous devons nous intéresser d’un peu plus prêt au Notification.Name :

extension NSNotification {
  public struct Name : RawRepresentable, Equatable, Hashable, Comparable {
    public init(_ rawValue: String)
    public init(rawValue: String)
  }
}

Une Notification.Name est en réalité une simple structure avec 2 initialisers publiques. Nous allons donc créer de ce pas un évènement appelé .DisBonjour :

import Foundation

extension Notification.Name {
  static let DisBonjour = Notification.Name("DisBonjour")
}

Nous avons étendu le Notification.Name afin de pouvoir profiter de l’inférence de type de swift (voir le paragraphe suivant). Maintenant nous pouvons envoyer notre notification au centre de notification :

notificationCenter.post(name: .DisBonjour, object: self, userInfo: nil)

Comme nous avons étendu Notification.Name, et grâce à l’inférence de type de swift, nous pouvons utiliser directement la notation .DisBonjour au lieu de MaClasse.DisBonjour.
Maintenant tout object s’enregistrant pour .DisBonjour sera notifié lors de chaque envoie :

override func viewDidLoad() {
  super.viewDidLoad()

  let notificationCenter = NotificationCenter.default

  notificationCenter.addObserver(self, selector: #selector(disBonjour), name: .DisBonjour, object: nil)
}

@objc func disBonjour(notification: Notification) {
  print("Bonjour !")
}

Conclusion

Nous espérons que ce tutoriel aura répondu à toutes vos questions. Si ce n’est pas le cas n’hésitez pas à laisser vos questions ici ou sur notre twitter.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (3 votes, average: 4,67 out of 5)
Loading...

Aucun commentaire

Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.