dimanche 14 décembre 2014

Objective-C / Notification manager : un couple fort utile !


La Notification en Objective-C a été conçue dans l'esprit des Design Patterns ("patron de fabrication").

Nous parlons d'ailleurs en Objective-C du pattern <Notification>.

Le principal avantage des patterns est de minimiser le "couplage" ou liens entre les objets manipulés.

Ce qui permet d'obtenir un modèle objets / données plus allégé et de faciliter le travail des développeurs.

Revenons à notre pattern <Notification>.

Un objet peut ainsi diffuser des informations à d'autres objets sans tout connaître de ceux-ci.

Les objets qui souhaitent recevoir les informations "s'abonnent" (Les Obversateurs).

Chaque notification est gérée par le Notification Manager (ou centre de notification).

Son objectif est de distribuer les notifications.

Comment déclarer le Notification Manager ?

Prenons la classe MaClasse.m :

- (void) awakeFromNib {  
... 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];     
}


Comment "s'abonner" à une notification ?

- (void) awakeFromNib { 
...

  [nc addObserver:self selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification         object:self.window];
}

- (void) windowWillClose: (NSNotification *)notification {    
...
}

Dans cet exemple nous nous "abonnons" à l'événement <NSWindowWillCloseNotification> (événement système qui est généré lors de la fermeture d'une fenêtre).

Nous pouvons aussi nous "abonner" à une notification applicative.

static NSString * const Notification1 = @"MaNotification";

- (void) awakeFromNib { 
...

  [nc addObserver:self selector:@selector(ma_fonction:) name:Notification1 object: nil];
}

- (void) ma_fonction: (NSNotification *)notification {    
...
}

Dans cet exemple nous nous "abonnons" à la notification <Notification1> - notification définie par l'application.

A noter que dans la méthode <ma_fonction>, nous pouvons gérer les informations propres à la notification (paramètre <notification>).

Exemple de la gestion des informations d'une notification :

- (void) ma_fonction : (NSNotification *) information
{
    NSString *valeur = [[information userInfo] objectForKey: @"cle1"];
...
}

Dans cet exemple, nous récupérons la valeur de la clé "cle1".

Les informations sont gérées sous forme de "dictionnaire" (clé / valeur).


Comment "publier" ou poster une notification ?

Prenons la classe MaClasse2.m.

static NSString * const Notification1 = @"MaNotification";

- (void) awakeFromNib {  
... 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];     
}

- (void) ma_fonction {
   NSMutableArray *key = [[NSMutableArray alloc] init];
    
   [key addObject: @"cle1"];
   [key addObject: @"cle2"];
    
   NSMutableArray *value = [[NSMutableArray alloc] init];

   [value addObject: @"valeur1"];
   [value addObject: @"valeur2"];

   NSDictionary *dict = [NSDictionary dictionaryWithObjects: value forKeys: key];
    
   [nc postNotificationName: Notification1 object:self userInfo: dict];  
    
   [key release];
   key = nil;
    
   [value release];
   value = nil;
}

Nous "publions" une notification avec un dictionnaire des données composé de 2 couples clé / valeur.

La gestion des notifications sous Objective-C est puissante mais trop de notifications peuvent nuire à la lisibilité de votre application.

La création d'une notification doit donc se réfléchir.

Ma notification sera t-elle utilisée amplement par les objets de mon application ?

Aucun commentaire:

Enregistrer un commentaire