SlideShare ist ein Scribd-Unternehmen logo
1 von 111
Blocks et
                            programmation
                         concurrente sous iOS

                                         Marc Boudou
                                         Freezy Snail
                                         Janvier 2012
Monday, January 16, 12
Programmation
                          concurrente
          Exécutions de plusieurs tâches en parallèle :
               • Tâche en background (UI non bloquant)
               • Performance : multiplication des coeurs



Monday, January 16, 12
Programmation
                          concurrente
          Exécutions de plusieurs tâches en parallèle :
               • Tâche en background (UI non bloquant)
               • Performance : multiplication des coeurs
         Solutions :
              •
             Gérer les threads soit même
              • Utiliser les frameworks fournis par Apple
Monday, January 16, 12
3 parties
                    1. Blocks
                    2. Dispatch Queue : Grand Central Dispatch
                    3. Operation Queue : NSOperation et
                       NSOperationQueue




Monday, January 16, 12
Blocks

                    • Extension Objective C
                    • Depuis iOS 4.0




Monday, January 16, 12
Exemple d’utilisation
                          Suppression d'une vue avec fondu

                 1   .
                     [UIView beginAnimations:@"Anim" context:nil];
                 2   .
                     [UIView setAnimationDelegate:self];
                 3   .
                     [UIView setAnimationDuration:0.6 ];
                 4   .
                     [UIView setAnimationDidStopSelector:
                         @selector(fadeAnimationDidStop:finished:context:)];
                 5 . myView.alpha = 0;
                 6 . [UIView commitAnimations];




Monday, January 16, 12
Exemple d’utilisation
                          Suppression d'une vue avec fondu

                 1   .
                     [UIView beginAnimations:@"Anim" context:nil];
                 2   .
                     [UIView setAnimationDelegate:self];
                 3   .
                     [UIView setAnimationDuration:0.6 ];
                 4   .
                     [UIView setAnimationDidStopSelector:
                         @selector(fadeAnimationDidStop:finished:context:)];
                 5 . myView.alpha = 0;
                 6 . [UIView commitAnimations];


                 ...

                 - (void) fadeAnimationDidStop:(NSString *) animId
                                      finished:(NSNumber *) finished
                                       context:(void *) context
                 {
                     [myView removeFromSuperview];
                 }




Monday, January 16, 12
Exemple d’utilisation
                              Suppression d'une vue avec fondu


                                                     0.6


                         myView.alpha = 0;




                         [myView removeFromSuperview];




Monday, January 16, 12
Exemple d’utilisation
                              Suppression d'une vue avec fondu


                                                     0.6


                         myView.alpha = 0;




                         [myView removeFromSuperview];




Monday, January 16, 12
Exemple d’utilisation
                          Suppression d'une vue avec fondu

           [UIView animateWithDuration:0.6
                            animations:^{ myView.alpha = 0; }
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];




Monday, January 16, 12
Exemple d’utilisation
                             Suppression d'une vue avec fondu

           [UIView animateWithDuration:0.6
                            animations:^{ myView.alpha = 0; }
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];




                •        Code au même endroit

                •        Accès direct au contexte

                •        Blocks : remplace le couple delegate/selector


Monday, January 16, 12
Exemple : NSURLConnection
     NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/"];
     NSURLRequest* request = [NSURLRequest requestWithURL:url];
     NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self];




Monday, January 16, 12
Exemple : NSURLConnection
     NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/"];
     NSURLRequest* request = [NSURLRequest requestWithURL:url];
     NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self];


     NSURLConnection Delegate :


     - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
     {
     }

     - (void)connectionDidFinishLoading:(NSURLConnection *)connection
     {
     }




Monday, January 16, 12
Exemple : NSURLConnection
     NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/"];
     NSURLRequest* request = [NSURLRequest requestWithURL:url];
     NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self];


     NSURLConnection Delegate :


     - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
     {
     }

     - (void)connectionDidFinishLoading:(NSURLConnection *)connection
     {
     }


                    •    Code séparé

                    •    Gestion complexe si on veut faire plusieurs
                         requêtes dans la même classe


Monday, January 16, 12
Solution : Création de blocks
                               Exemple : FSHttpRequest
                         (encapsulation de NSURLConnection)




Monday, January 16, 12
Solution : Création de blocks
                               Exemple : FSHttpRequest
                         (encapsulation de NSURLConnection)

                 NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"];
                 FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

                 [request setCompletionBlock:^
                 {
                     // code connectionDidFinishLoading
                 }];
                 [request setFailedBlock:^(NSError* error)
                 {
                     // code didFailWithError
                 }];

                 [request start]; // asynchrone




Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];




Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];



           ^ void (void) {myView.alpha = 0;}




Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];



           ^ void (void) {myView.alpha = 0;}
           ^ void (BOOL finished) {[myView removeFromSuperview];}




Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];



           ^ void (void) {myView.alpha = 0;}
           ^ void (BOOL finished) {[myView removeFromSuperview];}




           • Block = Objet


Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];



           ^ void (void) {myView.alpha = 0;}
           ^ void (BOOL finished) {[myView removeFromSuperview];}




           • Block = Objet
           void (^myBlock)(BOOL); // déclaration variable




Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];



           ^ void (void) {myView.alpha = 0;}
           ^ void (BOOL finished) {[myView removeFromSuperview];}




           • Block = Objet
           void (^myBlock)(BOOL); // déclaration variable

           myBlock = ^ (BOOL finished) {[myView removeFromSuperview];}   // affectation




Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];



           ^ void (void) {myView.alpha = 0;}
           ^ void (BOOL finished) {[myView removeFromSuperview];}




           • Block = Objet
           void (^myBlock)(BOOL); // déclaration variable

           myBlock = ^ (BOOL finished) {[myView removeFromSuperview];}   // affectation

           myBlock(true); // utilisation




Monday, January 16, 12
Syntaxe
           [UIView animateWithDuration:
                            animations:^{myView.alpha = 0;}
                            completion:^(BOOL finished) {[myView removeFromSuperview];}];



           ^ void (void) {myView.alpha = 0;}
           ^ void (BOOL finished) {[myView removeFromSuperview];}




           • Block = Objet
           void (^myBlock)(BOOL); // déclaration variable

           myBlock = ^ (BOOL finished) {[myView removeFromSuperview];}   // affectation

           myBlock(true); // utilisation

           int i = anotherBlock(); // utilisation autre block




Monday, January 16, 12
Solution : Création de blocks
                               Exemple : FSHttpRequest
                         (encapsulation de NSURLConnection)

                 NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"];
                 FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

                 [request setCompletionBlock:^
                 {
                     // code connectionDidFinishLoading
                 }];
                 [request setFailedBlock:^(NSError* error)
                 {
                     // code didFailWithError
                 }];

                 [request start]; // asynchrone




Monday, January 16, 12
FSHttpRequest : .h

                  @interface FSHttpRequest
                  {
                  !   // variables pointant vers un block
                  !   void (^completionBlock)(void);
                      void (^failedBlock)(NSError*);

                  }




Monday, January 16, 12
FSHttpRequest : .h
                  typedef void (^BasicBlock)(void);
                  typedef void (^ErrorBlock)(NSError* error);

                  @interface FSHttpRequest
                  {
                  !   // variables pointant vers un block
                  !   void (^completionBlock)(void);
                      void (^failedBlock)(NSError*);

                  }




Monday, January 16, 12
FSHttpRequest : .h
                  typedef void (^BasicBlock)(void);
                  typedef void (^ErrorBlock)(NSError* error);

                  @interface FSHttpRequest
                  {
                  !   // variables pointant vers un block
                  !   BasicBlock completionBlock;
                      ErrorBlock failedBlock;

                  }




Monday, January 16, 12
FSHttpRequest : .h
                  typedef void (^BasicBlock)(void);
                  typedef void (^ErrorBlock)(NSError* error);

                  @interface FSHttpRequest
                  {
                  !   // variables pointant vers un block
                  !   BasicBlock completionBlock;
                      ErrorBlock failedBlock;

                  }

                  - (void)setCompletionBlock:(BasicBlock)aCompletionBlock;
                  - (void)setFailedBlock:(ErrorBlock)aFailedBlock;




Monday, January 16, 12
FSHttpRequest : .m
                         @implementation FSHttpRequest




                         @end

Monday, January 16, 12
FSHttpRequest : .m
                         @implementation FSHttpRequest

                         - (void)setCompletionBlock:(BasicBlock)aCompletionBlock
                         {
                         !   [completionBlock release];
                         !   completionBlock = [aCompletionBlock copy]; // block créé sur
                         la pile, copy permet de le déplacer sur le tas
                         }




                         @end

Monday, January 16, 12
FSHttpRequest : .m
                         @implementation FSHttpRequest

                         - (void)setCompletionBlock:(BasicBlock)aCompletionBlock
                         {
                         !   [completionBlock release];
                         !   completionBlock = [aCompletionBlock copy]; // block créé sur
                         la pile, copy permet de le déplacer sur le tas
                         }

                         - (void)setFailedBlock:(ErrorBlock)aFailedBlock
                         {
                             [failedBlock release];
                         !   failedBlock = [aFailedBlock copy];
                         }




                         @end

Monday, January 16, 12
FSHttpRequest : .m
                         @implementation FSHttpRequest

                         - (void)setCompletionBlock:(BasicBlock)aCompletionBlock
                         {
                         !   [completionBlock release];
                         !   completionBlock = [aCompletionBlock copy]; // block créé sur
                         la pile, copy permet de le déplacer sur le tas
                         }

                         - (void)setFailedBlock:(ErrorBlock)aFailedBlock
                         {
                             [failedBlock release];
                         !   failedBlock = [aFailedBlock copy];
                         }

                         NSURLConnection Delegate :

                         - (void)connection:(NSURLConnection *)connection
                         didFailWithError:(NSError *)error
                         {
                         !   failedBlock(error);
                         }




                         @end

Monday, January 16, 12
FSHttpRequest : .m
                         @implementation FSHttpRequest

                         - (void)setCompletionBlock:(BasicBlock)aCompletionBlock
                         {
                         !   [completionBlock release];
                         !   completionBlock = [aCompletionBlock copy]; // block créé sur
                         la pile, copy permet de le déplacer sur le tas
                         }

                         - (void)setFailedBlock:(ErrorBlock)aFailedBlock
                         {
                             [failedBlock release];
                         !   failedBlock = [aFailedBlock copy];
                         }

                         NSURLConnection Delegate :

                         - (void)connection:(NSURLConnection *)connection
                         didFailWithError:(NSError *)error
                         {
                         !   failedBlock(error);
                         }

                         - (void)connectionDidFinishLoading:(NSURLConnection *)connection
                         {
                         !   completionBlock();
                         }
                         @end

Monday, January 16, 12
FSHttpRequest : utilisation


                 NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"];
                 FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

                 [request setCompletionBlock:^
                 {
                     // code connectionDidFinishLoading
                 }];
                 [request setFailedBlock:^(NSError* error)
                 {
                     // code didFailWithError
                 }];

                 [request start]; // asynchrone




Monday, January 16, 12
Utilisation du contexte
    Mise à jour d'une ProgressBar lors d'un téléchargement de fichier




Monday, January 16, 12
Utilisation du contexte
    Mise à jour d'une ProgressBar lors d'un téléchargement de fichier

            NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"];
            FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

            [request setBytesReceivedBlock:^(unsigned int size, long long total)
            {




            }];

            [request start];




Monday, January 16, 12
Utilisation du contexte
    Mise à jour d'une ProgressBar lors d'un téléchargement de fichier

            NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"];
            FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

            [request setBytesReceivedBlock:^(unsigned int size, long long total)
            {




            }];

            [request start];




       •      BytesReceivedBlock appelé lorsqu'on reçoit des données du
              serveur (NSURLConnection Delegate : didReceiveData)



Monday, January 16, 12
Utilisation du contexte
    Mise à jour d'une ProgressBar lors d'un téléchargement de fichier

            NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"];
            FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

            [request setBytesReceivedBlock:^(unsigned int size, long long total)
            {
                    label.text = [url path];




            }];

            [request start];




       •      BytesReceivedBlock appelé lorsqu'on reçoit des données du
              serveur (NSURLConnection Delegate : didReceiveData)
      •       url : accès par copie


Monday, January 16, 12
Utilisation du contexte
    Mise à jour d'une ProgressBar lors d'un téléchargement de fichier
            unsigned int nbBytesReceived = 0;
            NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"];
            FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

            [request setBytesReceivedBlock:^(unsigned int size, long long total)
            {
                    label.text = [url path];

                         nbBytesReceived += size;
                         progressView.nbBytesReceived = nbBytesReceived;
                         progressView.nbBytesTotal = total;
            }];

            [request start];




       •      BytesReceivedBlock appelé lorsqu'on reçoit des données du
              serveur (NSURLConnection Delegate : didReceiveData)
      •       url : accès par copie


Monday, January 16, 12
Utilisation du contexte
    Mise à jour d'une ProgressBar lors d'un téléchargement de fichier
            __block unsigned int nbBytesReceived = 0;
            NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"];
            FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

            [request setBytesReceivedBlock:^(unsigned int size, long long total)
            {
                    label.text = [url path];

                         nbBytesReceived += size;
                         progressView.nbBytesReceived = nbBytesReceived;
                         progressView.nbBytesTotal = total;
            }];

            [request start];




       •      BytesReceivedBlock appelé lorsqu'on reçoit des données du
              serveur (NSURLConnection Delegate : didReceiveData)
      •       url : accès par copie

      •       nbBytesReceived : accès par référence (modification possible)
Monday, January 16, 12
Dispatch Queue : GCD




Monday, January 16, 12
Dispatch Queue : GCD
      • Basé sur libdispatch (C library)
      • Gère les threads à notre place
      • Gère les problèmes de concurrence (lock, ...)



Monday, January 16, 12
Dispatch Queue : GCD
      • Basé sur libdispatch (C library)
      • Gère les threads à notre place
      • Gère les problèmes de concurrence (lock, ...)
             => code plus simple à écrire
             => utilisation automatiques des coeurs
             => gestion des ressources processeur optimisée
                         (création/réutilisation de thread automatique, ...)

Monday, January 16, 12
Notion de queue




Monday, January 16, 12
Notion de queue
      • Liste FIFO de blocks à exécuter
       • Ajout de block dans une queue
       • Exécution immédiate du bloc
      • Gère les threads qui exécutent les blocks


Monday, January 16, 12
Dispatch Queue : 3 types




Monday, January 16, 12
Dispatch Queue : 3 types

          • Main queue (main thread) : mise a jour de l'UI
          • Serial Queue : exécution en série des blocks sur
                 un seul thread
          • Global Queue : exécution en parallèle des blocks


Monday, January 16, 12
Serial Queue
                 Thread courant

            Block1 Block2 Block3




                                            Autre Thread
                                   Serial
                                   Queue


Monday, January 16, 12
Serial Queue
                 Thread courant

            Block1 Block2 Block3



          Création et ajout
         de blocks à la Serial
           Queue (FIFO)

                                            Autre Thread
                                   Serial
                                   Queue


Monday, January 16, 12
Serial Queue
                 Thread courant

                         Block2 Block3



          Création et ajout
         de blocks à la Serial
           Queue (FIFO)
                                         Block1

                                                  Autre Thread
                                         Serial
                                         Queue


Monday, January 16, 12
Serial Queue
                 Thread courant

                            Block3



          Création et ajout
         de blocks à la Serial
                                     Block2
           Queue (FIFO)
                                     Block1

                                              Autre Thread
                                     Serial
                                     Queue


Monday, January 16, 12
Serial Queue
                 Thread courant




          Création et ajout       Block3

         de blocks à la Serial
                                  Block2
           Queue (FIFO)
                                  Block1

                                           Autre Thread
                                  Serial
                                  Queue


Monday, January 16, 12
Serial Queue
                 Thread courant

                                                  Serial queue :
                                              dispatche les blocks à
          Création et ajout       Block3      un seul thread dans le
         de blocks à la Serial                    même ordre
                                  Block2
           Queue (FIFO)
                                  Block1

                                           Autre Thread
                                  Serial
                                  Queue


Monday, January 16, 12
Serial Queue
                 Thread courant

                                                  Serial queue :
                                              dispatche les blocks à
          Création et ajout                   un seul thread dans le
         de blocks à la Serial                    même ordre
                                  Block3
           Queue (FIFO)
                                  Block2

                                           Autre Thread
                                  Serial
                                  Queue      Block1



Monday, January 16, 12
Serial Queue
                 Thread courant

                                                  Serial queue :
                                              dispatche les blocks à
          Création et ajout                   un seul thread dans le
         de blocks à la Serial                    même ordre
                                  Block3
           Queue (FIFO)
                                  Block2

                                           Autre Thread
                                  Serial
                                  Queue


Monday, January 16, 12
Serial Queue
                 Thread courant

                                                  Serial queue :
                                              dispatche les blocks à
          Création et ajout                   un seul thread dans le
         de blocks à la Serial                    même ordre
           Queue (FIFO)
                                  Block3

                                           Autre Thread
                                  Serial
                                  Queue      Block2



Monday, January 16, 12
Serial Queue
                 Thread courant

                                                  Serial queue :
                                              dispatche les blocks à
          Création et ajout                   un seul thread dans le
         de blocks à la Serial                    même ordre
           Queue (FIFO)
                                  Block3

                                           Autre Thread
                                  Serial
                                  Queue


Monday, January 16, 12
Serial Queue
                 Thread courant

                                                  Serial queue :
                                              dispatche les blocks à
          Création et ajout                   un seul thread dans le
         de blocks à la Serial                    même ordre
           Queue (FIFO)

                                           Autre Thread
                                  Serial
                                  Queue       Block3



Monday, January 16, 12
Serial Queue
                 Thread courant

                                                  Serial queue :
                                              dispatche les blocks à
          Création et ajout                   un seul thread dans le
         de blocks à la Serial                    même ordre
           Queue (FIFO)

                                           Autre Thread
                                  Serial
                                  Queue


Monday, January 16, 12
Global Queue
                 Thread courant

            Block1 Block2 Block3




                                            Thread core 1   Thread core 2
                                   Global
                                   Queue


Monday, January 16, 12
Global Queue
                 Thread courant

            Block1 Block2 Block3



        Création et ajout de
         blocks à la Global
           Queue (FIFO)

                                            Thread core 1   Thread core 2
                                   Global
                                   Queue


Monday, January 16, 12
Global Queue
                 Thread courant

                         Block2 Block3



        Création et ajout de
         blocks à la Global
           Queue (FIFO)
                                         Block1

                                                  Thread core 1   Thread core 2
                                         Global
                                         Queue


Monday, January 16, 12
Global Queue
                 Thread courant

                            Block3



        Création et ajout de
         blocks à la Global
                                     Block2
           Queue (FIFO)
                                     Block1

                                              Thread core 1   Thread core 2
                                     Global
                                     Queue


Monday, January 16, 12
Global Queue
                 Thread courant




        Création et ajout de      Block3

         blocks à la Global
                                  Block2
           Queue (FIFO)
                                  Block1

                                           Thread core 1   Thread core 2
                                  Global
                                  Queue


Monday, January 16, 12
Global Queue
                 Thread courant

                                                  Global queue :
                                              dispatche les blocks à
        Création et ajout de      Block3
                                                plusieurs threads
         blocks à la Global
                                  Block2
           Queue (FIFO)
                                  Block1

                                           Thread core 1   Thread core 2
                                  Global
                                  Queue


Monday, January 16, 12
Global Queue
                 Thread courant

                                                  Global queue :
                                              dispatche les blocks à
        Création et ajout de                    plusieurs threads
         blocks à la Global
           Queue (FIFO)
                                  Block3

                                           Thread core 1   Thread core 2
                                  Global
                                  Queue      Block1           Block2



Monday, January 16, 12
Global Queue
                 Thread courant

                                                  Global queue :
                                              dispatche les blocks à
        Création et ajout de                    plusieurs threads
         blocks à la Global
           Queue (FIFO)

                                           Thread core 1   Thread core 2
                                  Global
                                  Queue      Block1           Block3



Monday, January 16, 12
Global Queue
                 Thread courant

                                                  Global queue :
                                              dispatche les blocks à
        Création et ajout de                    plusieurs threads
         blocks à la Global
           Queue (FIFO)

                                           Thread core 1   Thread core 2
                                  Global
                                  Queue      Block1



Monday, January 16, 12
Global Queue
                 Thread courant

                                                  Global queue :
                                              dispatche les blocks à
        Création et ajout de                    plusieurs threads
         blocks à la Global
           Queue (FIFO)

                                           Thread core 1   Thread core 2
                                  Global
                                  Queue


Monday, January 16, 12
Queue : Création / Utilisation




Monday, January 16, 12
Queue : Création / Utilisation

  • Main Queue :
         dispatch_queue_t main_queue = dispatch_get_main_queue();




Monday, January 16, 12
Queue : Création / Utilisation

  • Main Queue :
         dispatch_queue_t main_queue = dispatch_get_main_queue();



  • Serial Queue :
         dispatch_queue_t serial_queue = dispatch_queue_create(@"QueueName", NULL);
         ...
         dispatch_release(serial_queue);




Monday, January 16, 12
Queue : Création / Utilisation

  • Main Queue :
         dispatch_queue_t main_queue = dispatch_get_main_queue();



  • Serial Queue :
         dispatch_queue_t serial_queue = dispatch_queue_create(@"QueueName", NULL);
         ...
         dispatch_release(serial_queue);



  • Global Queue :
         dispatch_queue_t global_queue =
         dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

         =>    LOW, DEFAULT, HIGH

Monday, January 16, 12
Exemple :
                         Calcul background + UI update




Monday, January 16, 12
Exemple :
                         Calcul background + UI update
        dispatch_queue_t global_queue=
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        dispatch_async(global_queue, ^
        {
            // long calcul : transformation XML en HTML avec XSL
            NSString * htmlString = [self computeHtml:@"data.xml"];

               dispatch_async(dispatch_get_main_queue(), ^
               {
                   [maWebView loadHTMLString:htmlString baseURL:nil];
               });
        });




Monday, January 16, 12
Exemple :
                         Calcul background + UI update
        dispatch_queue_t global_queue=
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        dispatch_async(global_queue, ^
        {
            // long calcul : transformation XML en HTML avec XSL
            NSString * htmlString = [self computeHtml:@"data.xml"];

               dispatch_async(dispatch_get_main_queue(), ^
               {
                   [maWebView loadHTMLString:htmlString baseURL:nil];
               });
        });



          • 1er block : ajouté à la Global Queue
          • 2e block : ajouté à la Main Queue

Monday, January 16, 12
Exemple :
                         Calcul background + UI update
        dispatch_queue_t global_queue=
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        dispatch_async(global_queue, ^
        {
            // long calcul : transformation XML en HTML avec XSL
            NSString * htmlString = [self computeHtml:@"data.xml"];

               dispatch_async(dispatch_get_main_queue(), ^
               {
                   [maWebView loadHTMLString:htmlString baseURL:nil];
               });
        });



          • 1er block : ajouté à la Global Queue
          • 2e block : ajouté à la Main Queue
          • Synchrone : dispatch et attente fin exécution
          • Asynchrone : pas d’attente
Monday, January 16, 12
Exemple :
                         Calcul background + UI update
        dispatch_queue_t global_queue=
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        dispatch_async(global_queue, ^
        {
            // long calcul : transformation XML en HTML avec XSL
            NSString * htmlString = [self computeHtml:@"data.xml"];

               dispatch_async(dispatch_get_main_queue(), ^
               {
                   [maWebView loadHTMLString:htmlString baseURL:nil];
               });
        });



          • 1er block : ajouté à la Global Queue
          • 2e block : ajouté à la Main Queue
          • Synchrone : dispatch et attente fin exécution
          • Asynchrone : pas d’attente
          • Rendu HTML => Fin => UI update
Monday, January 16, 12
Operation Queue




Monday, January 16, 12
Operation Queue

                 • NSOperation et NSOperationQueue
                 • API haut niveau :
                         •   NSOperationQueue : Equivalent Cocoa (Objective-
                             C based) d'une concurrent Dispatch Queue (C
                             based)

                 •       N’utilise pas GCD pour l’instant mais multicore




Monday, January 16, 12
Operation Queue
                         Différences avec Dispatch Queue




Monday, January 16, 12
Operation Queue
                         Différences avec Dispatch Queue

   • Dispatch Queue : FIFO
   • NSOperationQueue plus complexe mais configurable :
               - priorités à la volée
               - dépendances
               - opérations (pause, maxConcurrentOperationCount, ...)
               - annulation d’une opération
               - ...
Monday, January 16, 12
Operation Queue : exemple




Monday, January 16, 12
Operation Queue : exemple

  • Application avec popup de login : user/password
              ==> plusieurs requêtes au lancement : une seule popup




Monday, January 16, 12
Operation Queue
            Thread courant

      NSOp1 NSOp2 NSOp3

              NSOp4 NSOp5




                                                          Thread 1

                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 1


Monday, January 16, 12
Operation Queue
                                         NSOp5
            Thread courant
                                         NSOp4

                                         NSOp3

                                         NSOp2

                                         NSOp1

                                                          Thread 1

                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 1


Monday, January 16, 12
Operation Queue
            Thread courant
                                         NSOp5

                                         NSOp4

                                         NSOp3

                                         NSOp2

                                                          Thread 1
                                         NSOp1
                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 1


Monday, January 16, 12
Operation Queue
            Thread courant
                                         NSOp5

                                         NSOp4

                                         NSOp3

                                         NSOp2

                                                          Thread 1
                                         NSOp1
                                          executing

                                      NSOperation          NSOp1
                                        Queue
                             maxConcurrentOperation = 1


Monday, January 16, 12
Operation Queue
            Thread courant
                                         NSOp5

                                         NSOp4

                                         NSOp3

                                         NSOp2

                                                          Thread 1

                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 3


Monday, January 16, 12
Operation Queue
            Thread courant               NSOp5

                                         NSOp4

                                         NSOp3

                                         NSOp2



                                                          Thread 1


                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                         NSOp5


                                         NSOp2
                                                          Thread 1
                                    NSOp3 NSOp4

                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                         NSOp5


                                         NSOp2
                                                          Thread 1   Thread 2
                                    NSOp3 NSOp4

                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                         NSOp5


                                         NSOp2
                                                          Thread 1   Thread 2   Thread 3
                                    NSOp3 NSOp4

                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                            NSOp5


                                            NSOp2
                                                 executing
                                                                    Thread 1   Thread 2   Thread 3
                                    NSOp3 NSOp4
                                     executing          executing    NSOp2      NSOp3      NSOp4
                                       NSOperation
                                         Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                            NSOp2
                                                 executing
                                                                    Thread 1   Thread 2   Thread 3
                                    NSOp5 NSOp4
                                     executing          executing    NSOp2      NSOp5      NSOp4
                                       NSOperation
                                         Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                            NSOp2
                                                 executing
                                                             Thread 1   Thread 2   Thread 3
                                    NSOp5
                                     executing                NSOp2      NSOp5
                                       NSOperation
                                         Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                                          Thread 1   Thread 2   Thread 3
                                    NSOp5
                                     executing                        NSOp5
                                       NSOperation
                                         Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
            Thread courant




                                                          Thread 1   Thread 2   Thread 3


                                      NSOperation
                                        Queue
                             maxConcurrentOperation = 3

Monday, January 16, 12
Operation Queue
                              Utilisation




Monday, January 16, 12
Operation Queue
                                          Utilisation
         @interface FSHttpRequest : NSOperation
         {

         }




Monday, January 16, 12
Rappel
              NSUrl * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"];
              FSHttpRequest *request = [FSHttpRequest requestWithUrl:url];

              [request setCompletionBlock:^
              {

              }];

              [request startRequest];




Monday, January 16, 12
Operation Queue
                                          Utilisation
         @interface FSHttpRequest : NSOperation
         {

         }




Monday, January 16, 12
Operation Queue
                                          Utilisation
         @interface FSHttpRequest : NSOperation
         {

         }

         @implementation FSHttpRequest



         - (void)startRequest:(NSURLRequest *)request
         {




         }

         @end


Monday, January 16, 12
Operation Queue
                                          Utilisation
         @interface FSHttpRequest : NSOperation
         {

         }

         @implementation FSHttpRequest

         static NSOperationQueue *queue = nil;

         - (void)startRequest:(NSURLRequest *)request
         {




         }

         @end


Monday, January 16, 12
Operation Queue
                                             Utilisation
         @interface FSHttpRequest : NSOperation
         {

         }

         @implementation FSHttpRequest

         static NSOperationQueue *queue = nil;

         - (void)startRequest:(NSURLRequest *)request
         {
         !   if(queue == nil)
             {
                 queue = [[NSOperationQueue alloc] init];
                 // default : une seule requête exécutée en parallèle
                 queue.maxConcurrentOperationCount = 1;
             }

                self.request = request;
                [queue addOperation:self];
         }

         @end


Monday, January 16, 12
Operation Queue
        - (void)start                        Utilisation
        {
            // Notifications KVO 'isExecuting'

               // Lancement requête
               [NSURLConnection connectionWithRequest:self.request delegate:self];
        }

        - (void)finish
        {
            // Notification KVO 'isFinished' à la queue :
            // Tâche supprimée de la queue, une autre peut être traitée
        }




Monday, January 16, 12
Operation Queue
        - (void)start                        Utilisation
        {
            // Notifications KVO 'isExecuting'

               // Lancement requête
               [NSURLConnection connectionWithRequest:self.request delegate:self];
        }

        - (void)finish
        {
            // Notification KVO 'isFinished' à la queue :
            // Tâche supprimée de la queue, une autre peut être traitée
        }

        NSURLConnection Delegate :

        - (void)connectionDidFinishLoading:(NSURLConnection *)connection
        {
        !   if(connexionOK)
        !   {
        !   !   queue.maxConcurrentOperationCount = 3;
        !   }

        !      completionBlock();
        !      [self finish];
        }

Monday, January 16, 12
Operation Queue
                         Ajouts de GCD : NSBlockOperation




Monday, January 16, 12
Operation Queue
                          Ajouts de GCD : NSBlockOperation

           •      Opérations simple : utilisation de blocks avec les
                  NSOperationQueue :
                         NSOperationQueue * queue = [[NSOperationQueue alloc] init];
                         NSBlockOperation * blockOp = [NSBlockOperation
                                            blockOperationWithBlock:^{ // Some code }];
                         [queue addOperation:blockOp];
                         [queue addOperationWithBlock:^{ // Another Block }];
                         [queue release];




Monday, January 16, 12
Operation Queue
                          Ajouts de GCD : NSBlockOperation

           •      Opérations simple : utilisation de blocks avec les
                  NSOperationQueue :
                         NSOperationQueue * queue = [[NSOperationQueue alloc] init];
                         NSBlockOperation * blockOp = [NSBlockOperation
                                            blockOperationWithBlock:^{ // Some code }];
                         [queue addOperation:blockOp];
                         [queue addOperationWithBlock:^{ // Another Block }];
                         [queue release];



         •       Dépendance entre Operations :
                         NSBlockOperation * op1 = ...;
                         NSBlockOperation * op2 = ...;

                         [op2 addDependencie:op1];




Monday, January 16, 12

Weitere ähnliche Inhalte

Was ist angesagt?

Introduction to WebRTC on iOS
Introduction to WebRTC on iOSIntroduction to WebRTC on iOS
Introduction to WebRTC on iOSCocoaHeads France
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads parisCocoaHeads France
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsCocoaHeads France
 
Apple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetApple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetCocoaHeads France
 
Test flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebiaTest flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebiaCocoaHeads France
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelCocoaHeads France
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mvMael Monnier
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads France
 
Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Yves-Emmanuel Jutard
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeadsRNS
 
Angular + JHipster @ Paris JUG
Angular + JHipster @ Paris JUGAngular + JHipster @ Paris JUG
Angular + JHipster @ Paris JUGWilliam Marques
 
AngularJS et autres techno frontend
AngularJS et autres techno frontendAngularJS et autres techno frontend
AngularJS et autres techno frontendyllieth
 
AngularJS - Présentation (french)
AngularJS - Présentation (french)AngularJS - Présentation (french)
AngularJS - Présentation (french)Yacine Rezgui
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile AppHabib MAALEM
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeadsRNS
 

Was ist angesagt? (20)

3D Touch
3D Touch3D Touch
3D Touch
 
Introduction to WebRTC on iOS
Introduction to WebRTC on iOSIntroduction to WebRTC on iOS
Introduction to WebRTC on iOS
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads paris
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers Storyboards
 
Apple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetApple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey Bocquet
 
Test flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebiaTest flight et les outils de distribution continue par simone civetta de xebia
Test flight et les outils de distribution continue par simone civetta de xebia
 
Multi-Threading Et Cocoa
Multi-Threading Et CocoaMulti-Threading Et Cocoa
Multi-Threading Et Cocoa
 
Hermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter MeuelHermes, génération et déploiement d'ipa by Peter Meuel
Hermes, génération et déploiement d'ipa by Peter Meuel
 
Plugins Xcode
Plugins XcodePlugins Xcode
Plugins Xcode
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mv
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - Epitez
 
Test flight
Test flightTest flight
Test flight
 
Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6
 
Angular + JHipster @ Paris JUG
Angular + JHipster @ Paris JUGAngular + JHipster @ Paris JUG
Angular + JHipster @ Paris JUG
 
AngularJS et autres techno frontend
AngularJS et autres techno frontendAngularJS et autres techno frontend
AngularJS et autres techno frontend
 
Développement web mobile avec IONIC 2
Développement web mobile avec IONIC 2Développement web mobile avec IONIC 2
Développement web mobile avec IONIC 2
 
AngularJS - Présentation (french)
AngularJS - Présentation (french)AngularJS - Présentation (french)
AngularJS - Présentation (french)
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile App
 
CocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par CeledevCocoaHeads Rennes #14: Programmation Responsive par Celedev
CocoaHeads Rennes #14: Programmation Responsive par Celedev
 

Andere mochten auch

Andere mochten auch (6)

CocoaHeads Toulouse - Getting to the core of Core Data
CocoaHeads Toulouse - Getting to the core of Core DataCocoaHeads Toulouse - Getting to the core of Core Data
CocoaHeads Toulouse - Getting to the core of Core Data
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
 
What's new in iOS9
What's new in iOS9What's new in iOS9
What's new in iOS9
 
BitTorrent on iOS
BitTorrent on iOSBitTorrent on iOS
BitTorrent on iOS
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 

Mehr von CocoaHeads France

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer FutureCocoaHeads France
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11CocoaHeads France
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeadsCocoaHeads France
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notificationsCocoaHeads France
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECocoaHeads France
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec BitriseCocoaHeads France
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérienceCocoaHeads France
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?CocoaHeads France
 
Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?CocoaHeads France
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.CocoaHeads France
 

Mehr von CocoaHeads France (20)

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
 
Super combinators
Super combinatorsSuper combinators
Super combinators
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
 
Handle the error
Handle the errorHandle the error
Handle the error
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
CloudKit as a backend
CloudKit as a backendCloudKit as a backend
CloudKit as a backend
 
Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.
 

CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente

  • 1. Blocks et programmation concurrente sous iOS Marc Boudou Freezy Snail Janvier 2012 Monday, January 16, 12
  • 2. Programmation concurrente Exécutions de plusieurs tâches en parallèle : • Tâche en background (UI non bloquant) • Performance : multiplication des coeurs Monday, January 16, 12
  • 3. Programmation concurrente Exécutions de plusieurs tâches en parallèle : • Tâche en background (UI non bloquant) • Performance : multiplication des coeurs Solutions : • Gérer les threads soit même • Utiliser les frameworks fournis par Apple Monday, January 16, 12
  • 4. 3 parties 1. Blocks 2. Dispatch Queue : Grand Central Dispatch 3. Operation Queue : NSOperation et NSOperationQueue Monday, January 16, 12
  • 5. Blocks • Extension Objective C • Depuis iOS 4.0 Monday, January 16, 12
  • 6. Exemple d’utilisation Suppression d'une vue avec fondu 1 . [UIView beginAnimations:@"Anim" context:nil]; 2 . [UIView setAnimationDelegate:self]; 3 . [UIView setAnimationDuration:0.6 ]; 4 . [UIView setAnimationDidStopSelector: @selector(fadeAnimationDidStop:finished:context:)]; 5 . myView.alpha = 0; 6 . [UIView commitAnimations]; Monday, January 16, 12
  • 7. Exemple d’utilisation Suppression d'une vue avec fondu 1 . [UIView beginAnimations:@"Anim" context:nil]; 2 . [UIView setAnimationDelegate:self]; 3 . [UIView setAnimationDuration:0.6 ]; 4 . [UIView setAnimationDidStopSelector: @selector(fadeAnimationDidStop:finished:context:)]; 5 . myView.alpha = 0; 6 . [UIView commitAnimations]; ... - (void) fadeAnimationDidStop:(NSString *) animId finished:(NSNumber *) finished context:(void *) context { [myView removeFromSuperview]; } Monday, January 16, 12
  • 8. Exemple d’utilisation Suppression d'une vue avec fondu 0.6 myView.alpha = 0; [myView removeFromSuperview]; Monday, January 16, 12
  • 9. Exemple d’utilisation Suppression d'une vue avec fondu 0.6 myView.alpha = 0; [myView removeFromSuperview]; Monday, January 16, 12
  • 10. Exemple d’utilisation Suppression d'une vue avec fondu [UIView animateWithDuration:0.6 animations:^{ myView.alpha = 0; } completion:^(BOOL finished) {[myView removeFromSuperview];}]; Monday, January 16, 12
  • 11. Exemple d’utilisation Suppression d'une vue avec fondu [UIView animateWithDuration:0.6 animations:^{ myView.alpha = 0; } completion:^(BOOL finished) {[myView removeFromSuperview];}]; • Code au même endroit • Accès direct au contexte • Blocks : remplace le couple delegate/selector Monday, January 16, 12
  • 12. Exemple : NSURLConnection NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/"]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self]; Monday, January 16, 12
  • 13. Exemple : NSURLConnection NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/"]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self]; NSURLConnection Delegate : - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { } Monday, January 16, 12
  • 14. Exemple : NSURLConnection NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/"]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self]; NSURLConnection Delegate : - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { } • Code séparé • Gestion complexe si on veut faire plusieurs requêtes dans la même classe Monday, January 16, 12
  • 15. Solution : Création de blocks Exemple : FSHttpRequest (encapsulation de NSURLConnection) Monday, January 16, 12
  • 16. Solution : Création de blocks Exemple : FSHttpRequest (encapsulation de NSURLConnection) NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setCompletionBlock:^ { // code connectionDidFinishLoading }]; [request setFailedBlock:^(NSError* error) { // code didFailWithError }]; [request start]; // asynchrone Monday, January 16, 12
  • 17. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; Monday, January 16, 12
  • 18. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; ^ void (void) {myView.alpha = 0;} Monday, January 16, 12
  • 19. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; ^ void (void) {myView.alpha = 0;} ^ void (BOOL finished) {[myView removeFromSuperview];} Monday, January 16, 12
  • 20. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; ^ void (void) {myView.alpha = 0;} ^ void (BOOL finished) {[myView removeFromSuperview];} • Block = Objet Monday, January 16, 12
  • 21. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; ^ void (void) {myView.alpha = 0;} ^ void (BOOL finished) {[myView removeFromSuperview];} • Block = Objet void (^myBlock)(BOOL); // déclaration variable Monday, January 16, 12
  • 22. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; ^ void (void) {myView.alpha = 0;} ^ void (BOOL finished) {[myView removeFromSuperview];} • Block = Objet void (^myBlock)(BOOL); // déclaration variable myBlock = ^ (BOOL finished) {[myView removeFromSuperview];} // affectation Monday, January 16, 12
  • 23. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; ^ void (void) {myView.alpha = 0;} ^ void (BOOL finished) {[myView removeFromSuperview];} • Block = Objet void (^myBlock)(BOOL); // déclaration variable myBlock = ^ (BOOL finished) {[myView removeFromSuperview];} // affectation myBlock(true); // utilisation Monday, January 16, 12
  • 24. Syntaxe [UIView animateWithDuration: animations:^{myView.alpha = 0;} completion:^(BOOL finished) {[myView removeFromSuperview];}]; ^ void (void) {myView.alpha = 0;} ^ void (BOOL finished) {[myView removeFromSuperview];} • Block = Objet void (^myBlock)(BOOL); // déclaration variable myBlock = ^ (BOOL finished) {[myView removeFromSuperview];} // affectation myBlock(true); // utilisation int i = anotherBlock(); // utilisation autre block Monday, January 16, 12
  • 25. Solution : Création de blocks Exemple : FSHttpRequest (encapsulation de NSURLConnection) NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setCompletionBlock:^ { // code connectionDidFinishLoading }]; [request setFailedBlock:^(NSError* error) { // code didFailWithError }]; [request start]; // asynchrone Monday, January 16, 12
  • 26. FSHttpRequest : .h @interface FSHttpRequest { ! // variables pointant vers un block ! void (^completionBlock)(void); void (^failedBlock)(NSError*); } Monday, January 16, 12
  • 27. FSHttpRequest : .h typedef void (^BasicBlock)(void); typedef void (^ErrorBlock)(NSError* error); @interface FSHttpRequest { ! // variables pointant vers un block ! void (^completionBlock)(void); void (^failedBlock)(NSError*); } Monday, January 16, 12
  • 28. FSHttpRequest : .h typedef void (^BasicBlock)(void); typedef void (^ErrorBlock)(NSError* error); @interface FSHttpRequest { ! // variables pointant vers un block ! BasicBlock completionBlock; ErrorBlock failedBlock; } Monday, January 16, 12
  • 29. FSHttpRequest : .h typedef void (^BasicBlock)(void); typedef void (^ErrorBlock)(NSError* error); @interface FSHttpRequest { ! // variables pointant vers un block ! BasicBlock completionBlock; ErrorBlock failedBlock; } - (void)setCompletionBlock:(BasicBlock)aCompletionBlock; - (void)setFailedBlock:(ErrorBlock)aFailedBlock; Monday, January 16, 12
  • 30. FSHttpRequest : .m @implementation FSHttpRequest @end Monday, January 16, 12
  • 31. FSHttpRequest : .m @implementation FSHttpRequest - (void)setCompletionBlock:(BasicBlock)aCompletionBlock { ! [completionBlock release]; ! completionBlock = [aCompletionBlock copy]; // block créé sur la pile, copy permet de le déplacer sur le tas } @end Monday, January 16, 12
  • 32. FSHttpRequest : .m @implementation FSHttpRequest - (void)setCompletionBlock:(BasicBlock)aCompletionBlock { ! [completionBlock release]; ! completionBlock = [aCompletionBlock copy]; // block créé sur la pile, copy permet de le déplacer sur le tas } - (void)setFailedBlock:(ErrorBlock)aFailedBlock { [failedBlock release]; ! failedBlock = [aFailedBlock copy]; } @end Monday, January 16, 12
  • 33. FSHttpRequest : .m @implementation FSHttpRequest - (void)setCompletionBlock:(BasicBlock)aCompletionBlock { ! [completionBlock release]; ! completionBlock = [aCompletionBlock copy]; // block créé sur la pile, copy permet de le déplacer sur le tas } - (void)setFailedBlock:(ErrorBlock)aFailedBlock { [failedBlock release]; ! failedBlock = [aFailedBlock copy]; } NSURLConnection Delegate : - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { ! failedBlock(error); } @end Monday, January 16, 12
  • 34. FSHttpRequest : .m @implementation FSHttpRequest - (void)setCompletionBlock:(BasicBlock)aCompletionBlock { ! [completionBlock release]; ! completionBlock = [aCompletionBlock copy]; // block créé sur la pile, copy permet de le déplacer sur le tas } - (void)setFailedBlock:(ErrorBlock)aFailedBlock { [failedBlock release]; ! failedBlock = [aFailedBlock copy]; } NSURLConnection Delegate : - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { ! failedBlock(error); } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { ! completionBlock(); } @end Monday, January 16, 12
  • 35. FSHttpRequest : utilisation NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setCompletionBlock:^ { // code connectionDidFinishLoading }]; [request setFailedBlock:^(NSError* error) { // code didFailWithError }]; [request start]; // asynchrone Monday, January 16, 12
  • 36. Utilisation du contexte Mise à jour d'une ProgressBar lors d'un téléchargement de fichier Monday, January 16, 12
  • 37. Utilisation du contexte Mise à jour d'une ProgressBar lors d'un téléchargement de fichier NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setBytesReceivedBlock:^(unsigned int size, long long total) { }]; [request start]; Monday, January 16, 12
  • 38. Utilisation du contexte Mise à jour d'une ProgressBar lors d'un téléchargement de fichier NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setBytesReceivedBlock:^(unsigned int size, long long total) { }]; [request start]; • BytesReceivedBlock appelé lorsqu'on reçoit des données du serveur (NSURLConnection Delegate : didReceiveData) Monday, January 16, 12
  • 39. Utilisation du contexte Mise à jour d'une ProgressBar lors d'un téléchargement de fichier NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setBytesReceivedBlock:^(unsigned int size, long long total) { label.text = [url path]; }]; [request start]; • BytesReceivedBlock appelé lorsqu'on reçoit des données du serveur (NSURLConnection Delegate : didReceiveData) • url : accès par copie Monday, January 16, 12
  • 40. Utilisation du contexte Mise à jour d'une ProgressBar lors d'un téléchargement de fichier unsigned int nbBytesReceived = 0; NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setBytesReceivedBlock:^(unsigned int size, long long total) { label.text = [url path]; nbBytesReceived += size; progressView.nbBytesReceived = nbBytesReceived; progressView.nbBytesTotal = total; }]; [request start]; • BytesReceivedBlock appelé lorsqu'on reçoit des données du serveur (NSURLConnection Delegate : didReceiveData) • url : accès par copie Monday, January 16, 12
  • 41. Utilisation du contexte Mise à jour d'une ProgressBar lors d'un téléchargement de fichier __block unsigned int nbBytesReceived = 0; NSURL * url = [NSURL URLWithString:@"http://www.cocoaheads.fr/toto.zip"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setBytesReceivedBlock:^(unsigned int size, long long total) { label.text = [url path]; nbBytesReceived += size; progressView.nbBytesReceived = nbBytesReceived; progressView.nbBytesTotal = total; }]; [request start]; • BytesReceivedBlock appelé lorsqu'on reçoit des données du serveur (NSURLConnection Delegate : didReceiveData) • url : accès par copie • nbBytesReceived : accès par référence (modification possible) Monday, January 16, 12
  • 42. Dispatch Queue : GCD Monday, January 16, 12
  • 43. Dispatch Queue : GCD • Basé sur libdispatch (C library) • Gère les threads à notre place • Gère les problèmes de concurrence (lock, ...) Monday, January 16, 12
  • 44. Dispatch Queue : GCD • Basé sur libdispatch (C library) • Gère les threads à notre place • Gère les problèmes de concurrence (lock, ...) => code plus simple à écrire => utilisation automatiques des coeurs => gestion des ressources processeur optimisée (création/réutilisation de thread automatique, ...) Monday, January 16, 12
  • 45. Notion de queue Monday, January 16, 12
  • 46. Notion de queue • Liste FIFO de blocks à exécuter • Ajout de block dans une queue • Exécution immédiate du bloc • Gère les threads qui exécutent les blocks Monday, January 16, 12
  • 47. Dispatch Queue : 3 types Monday, January 16, 12
  • 48. Dispatch Queue : 3 types • Main queue (main thread) : mise a jour de l'UI • Serial Queue : exécution en série des blocks sur un seul thread • Global Queue : exécution en parallèle des blocks Monday, January 16, 12
  • 49. Serial Queue Thread courant Block1 Block2 Block3 Autre Thread Serial Queue Monday, January 16, 12
  • 50. Serial Queue Thread courant Block1 Block2 Block3 Création et ajout de blocks à la Serial Queue (FIFO) Autre Thread Serial Queue Monday, January 16, 12
  • 51. Serial Queue Thread courant Block2 Block3 Création et ajout de blocks à la Serial Queue (FIFO) Block1 Autre Thread Serial Queue Monday, January 16, 12
  • 52. Serial Queue Thread courant Block3 Création et ajout de blocks à la Serial Block2 Queue (FIFO) Block1 Autre Thread Serial Queue Monday, January 16, 12
  • 53. Serial Queue Thread courant Création et ajout Block3 de blocks à la Serial Block2 Queue (FIFO) Block1 Autre Thread Serial Queue Monday, January 16, 12
  • 54. Serial Queue Thread courant Serial queue : dispatche les blocks à Création et ajout Block3 un seul thread dans le de blocks à la Serial même ordre Block2 Queue (FIFO) Block1 Autre Thread Serial Queue Monday, January 16, 12
  • 55. Serial Queue Thread courant Serial queue : dispatche les blocks à Création et ajout un seul thread dans le de blocks à la Serial même ordre Block3 Queue (FIFO) Block2 Autre Thread Serial Queue Block1 Monday, January 16, 12
  • 56. Serial Queue Thread courant Serial queue : dispatche les blocks à Création et ajout un seul thread dans le de blocks à la Serial même ordre Block3 Queue (FIFO) Block2 Autre Thread Serial Queue Monday, January 16, 12
  • 57. Serial Queue Thread courant Serial queue : dispatche les blocks à Création et ajout un seul thread dans le de blocks à la Serial même ordre Queue (FIFO) Block3 Autre Thread Serial Queue Block2 Monday, January 16, 12
  • 58. Serial Queue Thread courant Serial queue : dispatche les blocks à Création et ajout un seul thread dans le de blocks à la Serial même ordre Queue (FIFO) Block3 Autre Thread Serial Queue Monday, January 16, 12
  • 59. Serial Queue Thread courant Serial queue : dispatche les blocks à Création et ajout un seul thread dans le de blocks à la Serial même ordre Queue (FIFO) Autre Thread Serial Queue Block3 Monday, January 16, 12
  • 60. Serial Queue Thread courant Serial queue : dispatche les blocks à Création et ajout un seul thread dans le de blocks à la Serial même ordre Queue (FIFO) Autre Thread Serial Queue Monday, January 16, 12
  • 61. Global Queue Thread courant Block1 Block2 Block3 Thread core 1 Thread core 2 Global Queue Monday, January 16, 12
  • 62. Global Queue Thread courant Block1 Block2 Block3 Création et ajout de blocks à la Global Queue (FIFO) Thread core 1 Thread core 2 Global Queue Monday, January 16, 12
  • 63. Global Queue Thread courant Block2 Block3 Création et ajout de blocks à la Global Queue (FIFO) Block1 Thread core 1 Thread core 2 Global Queue Monday, January 16, 12
  • 64. Global Queue Thread courant Block3 Création et ajout de blocks à la Global Block2 Queue (FIFO) Block1 Thread core 1 Thread core 2 Global Queue Monday, January 16, 12
  • 65. Global Queue Thread courant Création et ajout de Block3 blocks à la Global Block2 Queue (FIFO) Block1 Thread core 1 Thread core 2 Global Queue Monday, January 16, 12
  • 66. Global Queue Thread courant Global queue : dispatche les blocks à Création et ajout de Block3 plusieurs threads blocks à la Global Block2 Queue (FIFO) Block1 Thread core 1 Thread core 2 Global Queue Monday, January 16, 12
  • 67. Global Queue Thread courant Global queue : dispatche les blocks à Création et ajout de plusieurs threads blocks à la Global Queue (FIFO) Block3 Thread core 1 Thread core 2 Global Queue Block1 Block2 Monday, January 16, 12
  • 68. Global Queue Thread courant Global queue : dispatche les blocks à Création et ajout de plusieurs threads blocks à la Global Queue (FIFO) Thread core 1 Thread core 2 Global Queue Block1 Block3 Monday, January 16, 12
  • 69. Global Queue Thread courant Global queue : dispatche les blocks à Création et ajout de plusieurs threads blocks à la Global Queue (FIFO) Thread core 1 Thread core 2 Global Queue Block1 Monday, January 16, 12
  • 70. Global Queue Thread courant Global queue : dispatche les blocks à Création et ajout de plusieurs threads blocks à la Global Queue (FIFO) Thread core 1 Thread core 2 Global Queue Monday, January 16, 12
  • 71. Queue : Création / Utilisation Monday, January 16, 12
  • 72. Queue : Création / Utilisation • Main Queue : dispatch_queue_t main_queue = dispatch_get_main_queue(); Monday, January 16, 12
  • 73. Queue : Création / Utilisation • Main Queue : dispatch_queue_t main_queue = dispatch_get_main_queue(); • Serial Queue : dispatch_queue_t serial_queue = dispatch_queue_create(@"QueueName", NULL); ... dispatch_release(serial_queue); Monday, January 16, 12
  • 74. Queue : Création / Utilisation • Main Queue : dispatch_queue_t main_queue = dispatch_get_main_queue(); • Serial Queue : dispatch_queue_t serial_queue = dispatch_queue_create(@"QueueName", NULL); ... dispatch_release(serial_queue); • Global Queue : dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); => LOW, DEFAULT, HIGH Monday, January 16, 12
  • 75. Exemple : Calcul background + UI update Monday, January 16, 12
  • 76. Exemple : Calcul background + UI update dispatch_queue_t global_queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); dispatch_async(global_queue, ^ { // long calcul : transformation XML en HTML avec XSL NSString * htmlString = [self computeHtml:@"data.xml"]; dispatch_async(dispatch_get_main_queue(), ^ { [maWebView loadHTMLString:htmlString baseURL:nil]; }); }); Monday, January 16, 12
  • 77. Exemple : Calcul background + UI update dispatch_queue_t global_queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); dispatch_async(global_queue, ^ { // long calcul : transformation XML en HTML avec XSL NSString * htmlString = [self computeHtml:@"data.xml"]; dispatch_async(dispatch_get_main_queue(), ^ { [maWebView loadHTMLString:htmlString baseURL:nil]; }); }); • 1er block : ajouté à la Global Queue • 2e block : ajouté à la Main Queue Monday, January 16, 12
  • 78. Exemple : Calcul background + UI update dispatch_queue_t global_queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); dispatch_async(global_queue, ^ { // long calcul : transformation XML en HTML avec XSL NSString * htmlString = [self computeHtml:@"data.xml"]; dispatch_async(dispatch_get_main_queue(), ^ { [maWebView loadHTMLString:htmlString baseURL:nil]; }); }); • 1er block : ajouté à la Global Queue • 2e block : ajouté à la Main Queue • Synchrone : dispatch et attente fin exécution • Asynchrone : pas d’attente Monday, January 16, 12
  • 79. Exemple : Calcul background + UI update dispatch_queue_t global_queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); dispatch_async(global_queue, ^ { // long calcul : transformation XML en HTML avec XSL NSString * htmlString = [self computeHtml:@"data.xml"]; dispatch_async(dispatch_get_main_queue(), ^ { [maWebView loadHTMLString:htmlString baseURL:nil]; }); }); • 1er block : ajouté à la Global Queue • 2e block : ajouté à la Main Queue • Synchrone : dispatch et attente fin exécution • Asynchrone : pas d’attente • Rendu HTML => Fin => UI update Monday, January 16, 12
  • 81. Operation Queue • NSOperation et NSOperationQueue • API haut niveau : • NSOperationQueue : Equivalent Cocoa (Objective- C based) d'une concurrent Dispatch Queue (C based) • N’utilise pas GCD pour l’instant mais multicore Monday, January 16, 12
  • 82. Operation Queue Différences avec Dispatch Queue Monday, January 16, 12
  • 83. Operation Queue Différences avec Dispatch Queue • Dispatch Queue : FIFO • NSOperationQueue plus complexe mais configurable : - priorités à la volée - dépendances - opérations (pause, maxConcurrentOperationCount, ...) - annulation d’une opération - ... Monday, January 16, 12
  • 84. Operation Queue : exemple Monday, January 16, 12
  • 85. Operation Queue : exemple • Application avec popup de login : user/password ==> plusieurs requêtes au lancement : une seule popup Monday, January 16, 12
  • 86. Operation Queue Thread courant NSOp1 NSOp2 NSOp3 NSOp4 NSOp5 Thread 1 NSOperation Queue maxConcurrentOperation = 1 Monday, January 16, 12
  • 87. Operation Queue NSOp5 Thread courant NSOp4 NSOp3 NSOp2 NSOp1 Thread 1 NSOperation Queue maxConcurrentOperation = 1 Monday, January 16, 12
  • 88. Operation Queue Thread courant NSOp5 NSOp4 NSOp3 NSOp2 Thread 1 NSOp1 NSOperation Queue maxConcurrentOperation = 1 Monday, January 16, 12
  • 89. Operation Queue Thread courant NSOp5 NSOp4 NSOp3 NSOp2 Thread 1 NSOp1 executing NSOperation NSOp1 Queue maxConcurrentOperation = 1 Monday, January 16, 12
  • 90. Operation Queue Thread courant NSOp5 NSOp4 NSOp3 NSOp2 Thread 1 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 91. Operation Queue Thread courant NSOp5 NSOp4 NSOp3 NSOp2 Thread 1 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 92. Operation Queue Thread courant NSOp5 NSOp2 Thread 1 NSOp3 NSOp4 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 93. Operation Queue Thread courant NSOp5 NSOp2 Thread 1 Thread 2 NSOp3 NSOp4 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 94. Operation Queue Thread courant NSOp5 NSOp2 Thread 1 Thread 2 Thread 3 NSOp3 NSOp4 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 95. Operation Queue Thread courant NSOp5 NSOp2 executing Thread 1 Thread 2 Thread 3 NSOp3 NSOp4 executing executing NSOp2 NSOp3 NSOp4 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 96. Operation Queue Thread courant NSOp2 executing Thread 1 Thread 2 Thread 3 NSOp5 NSOp4 executing executing NSOp2 NSOp5 NSOp4 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 97. Operation Queue Thread courant NSOp2 executing Thread 1 Thread 2 Thread 3 NSOp5 executing NSOp2 NSOp5 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 98. Operation Queue Thread courant Thread 1 Thread 2 Thread 3 NSOp5 executing NSOp5 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 99. Operation Queue Thread courant Thread 1 Thread 2 Thread 3 NSOperation Queue maxConcurrentOperation = 3 Monday, January 16, 12
  • 100. Operation Queue Utilisation Monday, January 16, 12
  • 101. Operation Queue Utilisation @interface FSHttpRequest : NSOperation { } Monday, January 16, 12
  • 102. Rappel NSUrl * url = [NSURL URLWithString:@"http://www.cocoaheads.fr"]; FSHttpRequest *request = [FSHttpRequest requestWithUrl:url]; [request setCompletionBlock:^ { }]; [request startRequest]; Monday, January 16, 12
  • 103. Operation Queue Utilisation @interface FSHttpRequest : NSOperation { } Monday, January 16, 12
  • 104. Operation Queue Utilisation @interface FSHttpRequest : NSOperation { } @implementation FSHttpRequest - (void)startRequest:(NSURLRequest *)request { } @end Monday, January 16, 12
  • 105. Operation Queue Utilisation @interface FSHttpRequest : NSOperation { } @implementation FSHttpRequest static NSOperationQueue *queue = nil; - (void)startRequest:(NSURLRequest *)request { } @end Monday, January 16, 12
  • 106. Operation Queue Utilisation @interface FSHttpRequest : NSOperation { } @implementation FSHttpRequest static NSOperationQueue *queue = nil; - (void)startRequest:(NSURLRequest *)request { ! if(queue == nil) { queue = [[NSOperationQueue alloc] init]; // default : une seule requête exécutée en parallèle queue.maxConcurrentOperationCount = 1; } self.request = request; [queue addOperation:self]; } @end Monday, January 16, 12
  • 107. Operation Queue - (void)start Utilisation { // Notifications KVO 'isExecuting' // Lancement requête [NSURLConnection connectionWithRequest:self.request delegate:self]; } - (void)finish { // Notification KVO 'isFinished' à la queue : // Tâche supprimée de la queue, une autre peut être traitée } Monday, January 16, 12
  • 108. Operation Queue - (void)start Utilisation { // Notifications KVO 'isExecuting' // Lancement requête [NSURLConnection connectionWithRequest:self.request delegate:self]; } - (void)finish { // Notification KVO 'isFinished' à la queue : // Tâche supprimée de la queue, une autre peut être traitée } NSURLConnection Delegate : - (void)connectionDidFinishLoading:(NSURLConnection *)connection { ! if(connexionOK) ! { ! ! queue.maxConcurrentOperationCount = 3; ! } ! completionBlock(); ! [self finish]; } Monday, January 16, 12
  • 109. Operation Queue Ajouts de GCD : NSBlockOperation Monday, January 16, 12
  • 110. Operation Queue Ajouts de GCD : NSBlockOperation • Opérations simple : utilisation de blocks avec les NSOperationQueue : NSOperationQueue * queue = [[NSOperationQueue alloc] init]; NSBlockOperation * blockOp = [NSBlockOperation blockOperationWithBlock:^{ // Some code }]; [queue addOperation:blockOp]; [queue addOperationWithBlock:^{ // Another Block }]; [queue release]; Monday, January 16, 12
  • 111. Operation Queue Ajouts de GCD : NSBlockOperation • Opérations simple : utilisation de blocks avec les NSOperationQueue : NSOperationQueue * queue = [[NSOperationQueue alloc] init]; NSBlockOperation * blockOp = [NSBlockOperation blockOperationWithBlock:^{ // Some code }]; [queue addOperation:blockOp]; [queue addOperationWithBlock:^{ // Another Block }]; [queue release]; • Dépendance entre Operations : NSBlockOperation * op1 = ...; NSBlockOperation * op2 = ...; [op2 addDependencie:op1]; Monday, January 16, 12

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n