[iOS] Gestion d’événements

mercredi 2 septembre 2015

De manière générale, un programme informatique exécute de façon séquentielle une suite d’instructions. Mais dans la plupart du temps une application doit aussi réagir à différents événements qu’ils proviennent d’interactions avec le réseau, avec le système de fichier ou bien encore par l’utilisateur en lui-même via le clavier,souris ou le touché. La plupart du temps ces événements sont notifiés au programme sous forme de callback.

Sous iOS un callback est la fonction résultante d’un événement et peut se présenter sous 3 formes:

  • Type Target-action: Cette méthode permet de définir une action à exécuter depuis la cible (target) et sera appelé via le sélecteur.
    Exemple:
    #import <Foundation/Foundation.h>
    #import "Logger.h"
    int main(int argc, const char *argv[]) {
        @autoreleasepool {
            Logger *logger = [[Logger alloc] init];
    
            NSTimer *timer : [NSTimer scheduledTimerWithTimeInterval: 1.0
                                                              target: logger
                                                            selector: @selector:(onTick:)
                                                            userInfo: nil
                                                             repeats: YES];
    
            NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
            [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
            [runLoop run];
        }
        return 0;
    }
    #import <Foundation/Foundation.h>
    
    @interface Logger : NSObject
    - (void)onTick:(NSTimer *)timer;
    @end
    #import <Foundation/Foundation.h>
    
    @implementation Logger
    - (void)onTick:(NSTimer *)timer {
        NSLog(@"Tick!");
    }
    @end
    
  • Type Helper objects: ce type est surtout utiliser lorsque vous devez définir plusieurs types d’événements. Et donc l’objet implémentera un protocole et sont souvent identifiés par les termes delegate ou bien encore datasources.
    Le design pattern Delegate (Delegation sur Wikipedia) est un pattern majeur en Objective-C. Il est implémentable à travers la notion de protocole (@protocol).Les protocoles se différencient cependant par le fait qu’ils permettent de déclarer des méthodes requises ou optionnelles. Les méthodes optionnelles seront déclarées après le mot clé: @optional, alors que les méthodes requises seront déclarées après le mot clé @required. Lorsqu’une méthode est déclarée sans être précédée par un des mots clés @required ou @optional, le comportement associé par défaut à la méthode est @required.
  • Type Notification: Lorsque plusieurs objets sont susceptibles d’être intéressées par un ou plusieurs types d’événements, alors ces objets souscrivent au centre de notification. Le centre notification est une classe qui permet de dispatcher des événements à des objets qui se sont au préalable inscrits.
    #import <Foundation/Foundation.h>
    #import "Logger.h"
    
    int main(int argc, const char *argv[]) {
        @autoreleasepool {
            Logger *logger = [[Logger alloc] init];
    
            [[Reachability sharedReachability] setHostName:@"blog.xebia.fr"]];
            [Reachability sharedReachability].networkStatusNotificationsEnabled = YES;
    
            [NSNotificationCenter defaultCenter]
                                            addObserver:self
                                               selector:@selector(handleReachability: )
                                                   name:@"kNetworkReachabilityChangedNotification" object:nil];
    
            ...
    
            [[NSRunLoop currentRunLoo] run];
        }
        return 0;
    }
    #import <Foundation/Foundation.h>
    #import "Reachability.h"
    
    @interface Logger : NSObject
    - (void)handleReachability:(NSNotificationCenter*)notification;
    @end
    #import <Foundation/Foundation.h>
    
    @implementation Logger
    
    - (void)handleReachability:(NSNotificationCenter*)notification {
        if([[Reachability sharedReachability] remoteHostStatus] == NotReachable) {
            NSLog(@"Network not reachable!");
        }
        else {
            NSLog(@"Network reachable!");
        }
    }
    
    @end
    

Vous trouverez plus d’information sur le lien ici

Tags: callback , evenements