SlideShare a Scribd company logo
1 of 48
Download to read offline
A la découverte de
Grand Central Dispatch



  Pierre Duchêne
  Thomas Dupont
Sommaire

•   Blocks
     ➡   Exemples
     ➡   Syntaxe et utilisation
     ➡   Gestion mémoire
     ➡   Bonus

•   Grand Central Dispatch
     ➡   Introduction
     ➡   libdispatch
     ➡   API haut niveau
Blocks


Thomas Dupont
Exemples

NSArray* sortedArray = [myArray sortedArrayUsingFunction:intSort context:NULL];

...

NSInteger intSort(id obj1, id obj2, void* context)
{
    int v1 = [obj1 intValue];
    int v2 = [obj2 intValue];

      if (v1 < v2)
           return NSOrderedAscending;
      else if (v1 > v2)
           return NSOrderedDescending;
      else
           return NSOrderedSame;
}
Exemples

NSArray* sortedArray = [myArray sortedArrayUsingComparator:
     ^(id obj1, id obj2) {
          int v1 = [obj1 intValue];
          int v2 = [obj2 intValue];

          if (v1 < v2)
               return NSOrderedAscending;
          else if (v1 > v2)
               return NSOrderedDescending;
          else
               return NSOrderedSame;
    }];
Exemples
[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.6];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:
    @selector(fadeAnimationDidStop:finished:context:)];
myView.alpha = 0;
[UIView commitAnimations];

...

- (void)fadeAnimationDidStop:(NSString*)animId
                    finished:(NSNumber*)finished
                     context:(void*)context
{
    [myView removeFromSuperview];
}
Exemples
[UIView animateWithDuration: 0.6
  animations:^{ myView.alpha = 0; }
  completion:^(BOOL finished){ [myView removeFromSuperview]; }];
Exemples


[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(notifReceived:) name:@"MyNotif" object:nil ];

...

- (void)notifReceived:(NSNotification*)notif
{
    /* doing some stuff */
}
Exemples


[[NSNotificationCenter defaultCenter] addObserverForName: @"MyNotif" object:
     queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notif) {
        /* doing some stuff */
    }];
Syntaxe et utilisation



          ^ void (void) { NSLog(@"Hello World"); };
     t

              ur




                                    ns
                         es
 re

          to




                                   io
                     tr
ca

         re




                               ct
                    mè


                              ru
                ra
     de




                          st
               pa
 pe




                         In
           s
Ty


          de
      s
     pe
 Ty
Syntaxe et utilisation



      ^ void (void) { NSLog(@"Hello World"); };

<=>   ^ (void) { NSLog(@"Hello World"); };

<=>   ^ { NSLog(@"Hello World"); };
Syntaxe et utilisation



void (*myFunction)(int);



void (^myBlock )(int);

myBlock = ^(int i){ ... };
Syntaxe et utilisation



      void (^(^(myBlock)(void (^)(void)))(void);




<=>   typedef void (^aBlock)(void);
      aBlock (^myBlock)(aBlock);
Syntaxe et utilisation



myBlock();

myBlockwithParam(2);

int i = myBlockWithReturn();
Syntaxe et utilisation
         Capturer une variable en fait une copie constante



float newAlpha = 1;

[UIView animateWithDuration:0.5 delay:1 options:0
    animations:^{ myView.alpha = newAlpha; }
    completion:NULL];

newAlpha = 0;


                                              Copie constante
Syntaxe et utilisation
       Capturer une variable __block garde sa référence




__block int a = 3;

void (^incrementA)(void) = ^{ a++; };

incrementA();



                                       Référence
Gestion mémoire
               Un Block est créé sur la pile et non sur le tas !


typedef void (^Block)(void);

Block block;                                int* pInt;

if ( ... ) {                                if ( ... ) {
    block = ^{ ... };                           int a = 1;
                                                pInt = &a;
} else {                         <=>        } else {
    block = ^{ ... };                           int b = 1;
                                                pInt = &b;
}                                           }

block();                                    // utilisation de pInt


      Wrong
Gestion mémoire
               Copier un Block sur la pile le déplace sur le tas !


typedef void (^Block)(void);

Block block;

if ( ... ) {
    block = [[^{ ... }     copy]   autorelease];
} else {
     block = [[^{ ... }    copy]   autorelease];
}

block();




       Right
Gestion mémoire
                   Capturer un objet le retient !
Capturer une variable d’instance retient l’objet auquel elle appartient !



  MyClass.h
                                                   myObject
MyObject* myObject;
int myIvar;
                                                  retain cycle

                                         self                      Block
  MyClass.m

myObject = [[MyObject alloc] initWithBlock:^{
    NSLog(@"%i", myIvar);
}];
                                Wrong
Gestion mémoire
              Capturer un objet __block ne le retient pas !



  MyClass.h

MyObject* myObject;
int myIvar;




  MyClass.m

__block MyClass* selfBlock = self;
myObject = [[MyObject alloc] initWithBlock:^{
    NSLog(@"%i", selfBlock-> myIvar);
}];
                                 Right
Bonus
                   Effet Bounce des UIAlertView


v.transform = CGAffineTransformMakeScale(0.7, 0.7);
v.alpha = 0;
[self.view addSubview:v];

[UIView animateWithDuration:0.2 animations:^{
    v.transform = CGAffineTransformMakeScale(1.25, 1.25);
    v.alpha = 0.6;
} completion:^(BOOL finished) {
    [UIView animateWithDuration:0.15 animations:^{
         v.transform = CGAffineTransformMake(0.85, 0.85);
         v.alpha = 1;
    } completion:^(BOOL finished) {
         [UIView animateWithDuration:0.1 animations:^{
             v.transform = CGAffineTransformIdentity;
         } completion:NULL];
    }];
}];
Bonus



UIAlertView* alert = [[UIAlertView alloc] init... delegate: nil   ...];
[alert showWithCompletion:^(NSInteger index) {
    if (index == 1) {
         [UIApplication openURL:myURL];
    }
}];
[alert release];



                                                        N’existe pas!
                                                          Codons le
Bonus



@interface BlockAlertView : UIAlertView <UIAlertViewDelegate> {
     void (^completionBlock_)(NSInteger);
}

- (void)showWithCompletion:(void (^)(NSInteger index))completion;

@end
Bonus
@implementation BlockAlertView

- (void)showWithCompletion:(void (^)(NSInteger index))completion
{
    completionBlock_ = [completion copy];
    self.delegate = self;
    [self show];
}

- (void)alertView:(UIAlertView*)alert clickedButtonAtIndex:(NSInteger)index
{
    completionBlock_(index);
    [completionBlock_ release];
    completionBlock_ = nil;
}

- (void)alertViewCancel:(UIAlertView*)alert
{
    completionBlock_(-1);
    [completionBlock_ release];
    completionBlock_ = nil;
}

@end
Grand Central Dispatch


Pierre Duchêne
Introduction




• Nouveaux éléments de langage (Blocks)
• Une bibliothèque de fonctions (libdispatch)
   • Amélioration et simplification de la
       gestion de la concurrence
Introduction - Pourquoi GCD



• Complexité du multi-threading
• Multiplication des Cores sur toutes les plateformes
• Mauvaise gestion des ressources
Introduction - GCD c’est quoi?



• Gestion des threads au niveau du système
• Gestion des problématiques de concurrence
  (lock, semaphore...)
libdispatch - Queues



• Liste FIFO de Blocks à exécuter
  •   Ajout de Block FIFO

  •   Lancement de l’exécution d’un Block FIFO

• Gère les threads qui exécutent les Blocks
Queues


• Trois types de Queues :
 • Main Queue (Main Thread)
 • Private Dispatch Queue (exécution série)
 • Global Dispatch Queue (exécution parallèle)
Private Dispatch Queue
Current Thread


                  Block 3

 Ajoute Block 1
                  Block 2
   puis Block 2
   puis Block 3                  Exécute Block 1
                  Block 1           puis Block 2
                                    puis Block 3


                  Private
                  queue     Other Thread
Global Dispatch Queue
                                                     Puis Block 3 sur
Current Thread                                       le premier thread
                                                      qui sera libéré

                                                         potentiellement
                                                          avant la fin
                  Block 3                                  du Block 1


 Ajoute Block 1
                  Block 2
                                          puis Block 2
   puis Block 2
   puis Block 3
                  Block 1
                            Lance   Block 1


                  Global
                  queue         Thread Auto         Thread Auto
Queues



• Deux types d’exécution:
 • Synchrone
 • Asynchrone
libdispatch - import

• Comment utiliser libdispatch dans son projet?


   #import <dispatch/dispatch.h>
libdispatch - queue

• Comment créer une queue ?
 dispatch_queue_t main_queue;
 dispatch_queue_t serial_queue;
 dispatch_queue_t global_queue;

 // main queue
 main_queue = dispatch_get_main_queue();

 // private dispatch queue
 serial_queue = dispatch_queue_create("com.example.myQueue", NULL);

 // global dispath queue
 global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

 dispatch_release(serial_queue);
libdispatch - étude de cas

• Process en background + mise à jour de l’UI
  dispatch_queue_t background_queue;
  dispatch_queue_t main_queue;

  backgroung_queue = dispatch_queue_create("com.example.myQueue", NULL);
  main_queue = dispatch_get_main_queue();

  dispatch_async(background_queue, ^{
          int result = hardWorkInBackground();
          dispatch_async(main_queue, ^{
                updateUIWithData(result);
          });
  });

  dispatch_release(background_queue);
libdispatch - étude de cas

• Traitement sur les éléments d’un tableau

  dispatch_queue_t global_queue;
  global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  NSArray* mySudokuGrid = ...;

  dispatch_apply(nb_iteration,global_queue,^(size_t index){
       MyCell* cell = [mySudokuGrid objectAtIndex:index];
       [cell computeSolutions];
  });
libdispatch - étude de cas

• Comment remplacer les locks ?

 - (void)updateImageCacheWithImage:(UIImage*)img {
    NSLock* l = self.cacheLock;
    [l lock];
    // Section critique, ne pas ajouter deux fois la même image!
    if ([self.imageCache containsObj:img]) {
        [l unlock]; // Surtout ne pas oublier!
        return;
    }
    [self.imageCache addObj:img];
    [l unlock];
 }
libdispatch - étude de cas

• Simplement par une Queue!

   - (void)updateImageCacheWithImage:(UIImage*)img {

       dispatch_sync(serial_queue,^{
           // Section critique, ne pas ajouter deux fois la même image!
           if ([self.imageCache containsObj:img]) {
               return;
           }
           [self.imageCache addObj:img];
       });
   }



    ou mieux : dispatch_async
libdispatch - deadlock

• Attention aux deadlock
 dispatch_sync(queue, ^{
     // Some code
 ! dispatch_sync(queue, ^{ // Another block });
 });




                  Block 2
                                  !
                                            Block 1
                  Private
                  queue                 Other Thread
API haut niveau



• Grand Central Dispatch ajoute à l’existant
 • NSOperation
 • NSOperationQueue
API haut niveau



• NSBlockOperation
 • Classe concrête de NSOperation
 • Gère l’exécution en parallèle de un ou
    plusieurs Blocks
API haut niveau



• NSOperationQueue
 • C’est elle qui gère l’exécution des opérations
 • Peut être configurée
API haut niveau - base

• Créer et lancer une opération via NSOperationQueue :

   NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
   NSBlockOperation* blockOp = [NSBlockOperation blockOperationWithBlock:^{
      // Some Code
   }];

   [aQueue addOperation:blockOp];
   ...
   [aQueue addOperationWithBlock:^{ // Another Block }];
   ...
   [aQueue release];
API haut niveau - dépendance

• Comment indiquer des dépendances entre opérations?



  NSBlockOperation* op1 = ...:
  NSBlockOperation* op2 = ...:

  [op2 addDependencie:op1];
API haut niveau - iOS




     Sur iOS les NSOperationQueue
!    n’utilisent pas Grand Central Dispatch
Références
  http://developer.apple.com

  http://thirdcog.eu/pwcblocks/



Contacts
  pierre.duchene@niji.fr

  thomas.dupont@niji.fr
CocoaHeads #1                       julien@cocoaheads.fr

     http://cocoaheads.fr             thomas.dupont@cocoaheads.fr




Traduction automatique et intelligente d’applications Cocoa
  Mail   : olivier@foodreporter.net
  Web    : www.foodreporter.fr
  GitHub : github.com/AliSoftware



A la découverte de Grand Central Dispatch
  Mail : thomas.dupont@niji.fr
  Mail : pierre.duchene@niji.fr
  Web : www.niji.fr



Partenaire

More Related Content

What's hot

Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6Julien CROUZET
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Aurélien Regat-Barrel
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsAurélien Regat-Barrel
 
De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()Lorraine JUG
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreECAM Brussels Engineering School
 
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeadsRNS
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...ECAM Brussels Engineering School
 

What's hot (20)

Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
 
Part1
Part1Part1
Part1
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
 
Python avancé : Tuple et objet
Python avancé : Tuple et objetPython avancé : Tuple et objet
Python avancé : Tuple et objet
 
Cours php
Cours phpCours php
Cours php
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()De Runnable & synchronized à parallele() et atomically()
De Runnable & synchronized à parallele() et atomically()
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expertCocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
CocoaHeads Rennes #9 : Gestion mémoire, du débutant à l'expert
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
De Java à .NET
De Java à .NETDe Java à .NET
De Java à .NET
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Javascript proprement
Javascript proprementJavascript proprement
Javascript proprement
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 

Viewers also liked

Wie kommt der Professor auf mein Handy?
Wie kommt der Professor auf mein Handy?Wie kommt der Professor auf mein Handy?
Wie kommt der Professor auf mein Handy?Martin Ebner
 
Implicaciones de la Ley de Datos Personales en el Sector Privado
Implicaciones de la Ley de Datos Personales en el Sector PrivadoImplicaciones de la Ley de Datos Personales en el Sector Privado
Implicaciones de la Ley de Datos Personales en el Sector PrivadoGrupo Megamedia
 
Programa festa major sabadell 2013 dilluns 9
Programa festa major sabadell 2013 dilluns 9Programa festa major sabadell 2013 dilluns 9
Programa festa major sabadell 2013 dilluns 9iSabadell
 
Sr8 cm3falcón h daniela so en smartv
Sr8 cm3falcón h daniela so en smartvSr8 cm3falcón h daniela so en smartv
Sr8 cm3falcón h daniela so en smartvDaniz Smile
 
Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...
Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...
Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...DigiZen
 
Triforma: Management 2.0
Triforma: Management 2.0Triforma: Management 2.0
Triforma: Management 2.0Triforma
 
Mobile Music App Media Plan
Mobile Music App Media PlanMobile Music App Media Plan
Mobile Music App Media PlanHadiyah Daché
 
It driven business models slideshare
It driven business models slideshareIt driven business models slideshare
It driven business models slidesharernueesch
 
Presentació xuetes PROGRAMA XARXA Illes Balears
Presentació xuetes PROGRAMA XARXA Illes BalearsPresentació xuetes PROGRAMA XARXA Illes Balears
Presentació xuetes PROGRAMA XARXA Illes BalearsJoan Ferrer Ripoll
 
'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for Children
'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for Children'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for Children
'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for ChildrenVoices for Georgia's Children
 
107336 medilaser hijo de laura marcela mejia
107336 medilaser hijo de laura marcela mejia107336 medilaser hijo de laura marcela mejia
107336 medilaser hijo de laura marcela mejiaHerminton Ortiz Quimbaya
 
Janzz opuscolo informazioni_pmi_2
Janzz opuscolo informazioni_pmi_2Janzz opuscolo informazioni_pmi_2
Janzz opuscolo informazioni_pmi_2janzzcom
 
Vinix Unplugged Unconference 2012
Vinix Unplugged Unconference 2012Vinix Unplugged Unconference 2012
Vinix Unplugged Unconference 2012Marco Ghezzi
 
•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)
•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)
•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)Katie Amps
 
¿Como utilizar los mercados electronicos para exportar?
¿Como utilizar los mercados electronicos para exportar?¿Como utilizar los mercados electronicos para exportar?
¿Como utilizar los mercados electronicos para exportar?Carmen Urbano
 

Viewers also liked (20)

Wie kommt der Professor auf mein Handy?
Wie kommt der Professor auf mein Handy?Wie kommt der Professor auf mein Handy?
Wie kommt der Professor auf mein Handy?
 
Implicaciones de la Ley de Datos Personales en el Sector Privado
Implicaciones de la Ley de Datos Personales en el Sector PrivadoImplicaciones de la Ley de Datos Personales en el Sector Privado
Implicaciones de la Ley de Datos Personales en el Sector Privado
 
Programa festa major sabadell 2013 dilluns 9
Programa festa major sabadell 2013 dilluns 9Programa festa major sabadell 2013 dilluns 9
Programa festa major sabadell 2013 dilluns 9
 
Sr8 cm3falcón h daniela so en smartv
Sr8 cm3falcón h daniela so en smartvSr8 cm3falcón h daniela so en smartv
Sr8 cm3falcón h daniela so en smartv
 
Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...
Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...
Implicaciones de la web 2.0 para el assessment del aprendizaje y la transform...
 
Triforma: Management 2.0
Triforma: Management 2.0Triforma: Management 2.0
Triforma: Management 2.0
 
Endulzarte
EndulzarteEndulzarte
Endulzarte
 
Mobile Music App Media Plan
Mobile Music App Media PlanMobile Music App Media Plan
Mobile Music App Media Plan
 
A105_Vaskelis
A105_VaskelisA105_Vaskelis
A105_Vaskelis
 
It driven business models slideshare
It driven business models slideshareIt driven business models slideshare
It driven business models slideshare
 
Presentació xuetes PROGRAMA XARXA Illes Balears
Presentació xuetes PROGRAMA XARXA Illes BalearsPresentació xuetes PROGRAMA XARXA Illes Balears
Presentació xuetes PROGRAMA XARXA Illes Balears
 
Chapter 9
Chapter 9Chapter 9
Chapter 9
 
'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for Children
'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for Children'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for Children
'Check-Up' on Medicaid and Peachcare: Successes & Opportunities for Children
 
107336 medilaser hijo de laura marcela mejia
107336 medilaser hijo de laura marcela mejia107336 medilaser hijo de laura marcela mejia
107336 medilaser hijo de laura marcela mejia
 
Janzz opuscolo informazioni_pmi_2
Janzz opuscolo informazioni_pmi_2Janzz opuscolo informazioni_pmi_2
Janzz opuscolo informazioni_pmi_2
 
Maltrato
MaltratoMaltrato
Maltrato
 
Vinix Unplugged Unconference 2012
Vinix Unplugged Unconference 2012Vinix Unplugged Unconference 2012
Vinix Unplugged Unconference 2012
 
•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)
•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)
•ABSOLUTELY EMIRATES MAMA MEDIA PACK 2016_V3.mj (1)
 
¿Como utilizar los mercados electronicos para exportar?
¿Como utilizar los mercados electronicos para exportar?¿Como utilizar los mercados electronicos para exportar?
¿Como utilizar los mercados electronicos para exportar?
 
poltava
poltavapoltava
poltava
 

Similar to CocoaHeads Rennes #1 : Grand Central Dispatch

17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdfPatiento Del Mar
 
CocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeadsRNS
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tFrancois Ostyn
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / DisruptorSOAT
 
Wygday 2011 - C#5 Async CTP - Reactive Extensions
Wygday 2011  - C#5 Async CTP - Reactive ExtensionsWygday 2011  - C#5 Async CTP - Reactive Extensions
Wygday 2011 - C#5 Async CTP - Reactive Extensionswyggio
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations GreendroidGDG Nantes
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdfPatiento Del Mar
 
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads France
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdframadanmahdi
 
Procédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsProcédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsDenis Voituron
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMALoic Yon
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winformsChristophe Zome
 

Similar to CocoaHeads Rennes #1 : Grand Central Dispatch (20)

17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf
 
CocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOSCocoaHeads Rennes #3 : Bien débuter sur iOS
CocoaHeads Rennes #3 : Bien débuter sur iOS
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / Disruptor
 
POO-chapitre3.pptx
POO-chapitre3.pptxPOO-chapitre3.pptx
POO-chapitre3.pptx
 
Wygday 2011 - C#5 Async CTP - Reactive Extensions
Wygday 2011  - C#5 Async CTP - Reactive ExtensionsWygday 2011  - C#5 Async CTP - Reactive Extensions
Wygday 2011 - C#5 Async CTP - Reactive Extensions
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations Greendroid
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
 
cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdf
 
Patron observer
Patron observerPatron observer
Patron observer
 
Procédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsProcédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénients
 
Introduction au Jquery
Introduction au JqueryIntroduction au Jquery
Introduction au Jquery
 
Clonage d'objets
Clonage d'objetsClonage d'objets
Clonage d'objets
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMA
 
Presentation Csharp et winforms
Presentation Csharp et winformsPresentation Csharp et winforms
Presentation Csharp et winforms
 

More from CocoaHeadsRNS

CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeadsRNS
 
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 CocoaHeads Rennes #14: iOS7 Controllers Transitions CocoaHeads Rennes #14: iOS7 Controllers Transitions
CocoaHeads Rennes #14: iOS7 Controllers TransitionsCocoaHeadsRNS
 
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
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeadsRNS
 
CocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeadsRNS
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeadsRNS
 
CocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeadsRNS
 
CocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeadsRNS
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeadsRNS
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeadsRNS
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeadsRNS
 
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeadsRNS
 
Cocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaHeadsRNS
 
CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeadsRNS
 
CocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeadsRNS
 
CocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisationCocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisationCocoaHeadsRNS
 

More from CocoaHeadsRNS (16)

CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubs
 
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 CocoaHeads Rennes #14: iOS7 Controllers Transitions CocoaHeads Rennes #14: iOS7 Controllers Transitions
CocoaHeads Rennes #14: iOS7 Controllers Transitions
 
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
 
CocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical RecordCocoaHeads Rennes #13 : Magical Record
CocoaHeads Rennes #13 : Magical Record
 
CocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPodsCocoaHeads Rennes #13 : CocoaPods
CocoaHeads Rennes #13 : CocoaPods
 
CocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock ObjectsCocoaHeads Rennes #10 : Mock Objects
CocoaHeads Rennes #10 : Mock Objects
 
CocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : NotificationsCocoaHeads Rennes #10 : Notifications
CocoaHeads Rennes #10 : Notifications
 
CocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nulsCocoaHeads Rennes #7 : Intégration continue pour les nuls
CocoaHeads Rennes #7 : Intégration continue pour les nuls
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6
 
CocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & AndroidCocoaHeads Rennes #5 : iOS & Android
CocoaHeads Rennes #5 : iOS & Android
 
CocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOSCocoaHeads Rennes #4 : Tests automatisés sur iOS
CocoaHeads Rennes #4 : Tests automatisés sur iOS
 
CocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOSCocoaHeads Rennes #4 : la rotation sur iOS
CocoaHeads Rennes #4 : la rotation sur iOS
 
Cocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaheads Rennes #3 : Bien coder sur iOS
Cocoaheads Rennes #3 : Bien coder sur iOS
 
CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4CocoaHeads Rennes #2 : Xcode 4
CocoaHeads Rennes #2 : Xcode 4
 
CocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératifCocoaHeads Rennes #2 : Pratiques de développement itératif
CocoaHeads Rennes #2 : Pratiques de développement itératif
 
CocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisationCocoaHeads Rennes #1 : internationalisation
CocoaHeads Rennes #1 : internationalisation
 

CocoaHeads Rennes #1 : Grand Central Dispatch

  • 1. A la découverte de Grand Central Dispatch Pierre Duchêne Thomas Dupont
  • 2. Sommaire • Blocks ➡ Exemples ➡ Syntaxe et utilisation ➡ Gestion mémoire ➡ Bonus • Grand Central Dispatch ➡ Introduction ➡ libdispatch ➡ API haut niveau
  • 4. Exemples NSArray* sortedArray = [myArray sortedArrayUsingFunction:intSort context:NULL]; ... NSInteger intSort(id obj1, id obj2, void* context) { int v1 = [obj1 intValue]; int v2 = [obj2 intValue]; if (v1 < v2) return NSOrderedAscending; else if (v1 > v2) return NSOrderedDescending; else return NSOrderedSame; }
  • 5. Exemples NSArray* sortedArray = [myArray sortedArrayUsingComparator: ^(id obj1, id obj2) { int v1 = [obj1 intValue]; int v2 = [obj2 intValue]; if (v1 < v2) return NSOrderedAscending; else if (v1 > v2) return NSOrderedDescending; else return NSOrderedSame; }];
  • 6. Exemples [UIView beginAnimations:@"" context:nil]; [UIView setAnimationDuration:0.6]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector: @selector(fadeAnimationDidStop:finished:context:)]; myView.alpha = 0; [UIView commitAnimations]; ... - (void)fadeAnimationDidStop:(NSString*)animId finished:(NSNumber*)finished context:(void*)context { [myView removeFromSuperview]; }
  • 7. Exemples [UIView animateWithDuration: 0.6 animations:^{ myView.alpha = 0; } completion:^(BOOL finished){ [myView removeFromSuperview]; }];
  • 8. Exemples [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notifReceived:) name:@"MyNotif" object:nil ]; ... - (void)notifReceived:(NSNotification*)notif { /* doing some stuff */ }
  • 9. Exemples [[NSNotificationCenter defaultCenter] addObserverForName: @"MyNotif" object: queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notif) { /* doing some stuff */ }];
  • 10. Syntaxe et utilisation ^ void (void) { NSLog(@"Hello World"); }; t ur ns es re to io tr ca re ct mè ru ra de st pa pe In s Ty de s pe Ty
  • 11. Syntaxe et utilisation ^ void (void) { NSLog(@"Hello World"); }; <=> ^ (void) { NSLog(@"Hello World"); }; <=> ^ { NSLog(@"Hello World"); };
  • 12. Syntaxe et utilisation void (*myFunction)(int); void (^myBlock )(int); myBlock = ^(int i){ ... };
  • 13. Syntaxe et utilisation void (^(^(myBlock)(void (^)(void)))(void); <=> typedef void (^aBlock)(void); aBlock (^myBlock)(aBlock);
  • 15. Syntaxe et utilisation Capturer une variable en fait une copie constante float newAlpha = 1; [UIView animateWithDuration:0.5 delay:1 options:0 animations:^{ myView.alpha = newAlpha; } completion:NULL]; newAlpha = 0; Copie constante
  • 16. Syntaxe et utilisation Capturer une variable __block garde sa référence __block int a = 3; void (^incrementA)(void) = ^{ a++; }; incrementA(); Référence
  • 17. Gestion mémoire Un Block est créé sur la pile et non sur le tas ! typedef void (^Block)(void); Block block; int* pInt; if ( ... ) { if ( ... ) { block = ^{ ... }; int a = 1; pInt = &a; } else { <=> } else { block = ^{ ... }; int b = 1; pInt = &b; } } block(); // utilisation de pInt Wrong
  • 18. Gestion mémoire Copier un Block sur la pile le déplace sur le tas ! typedef void (^Block)(void); Block block; if ( ... ) { block = [[^{ ... } copy] autorelease]; } else { block = [[^{ ... } copy] autorelease]; } block(); Right
  • 19. Gestion mémoire Capturer un objet le retient ! Capturer une variable d’instance retient l’objet auquel elle appartient ! MyClass.h myObject MyObject* myObject; int myIvar; retain cycle self Block MyClass.m myObject = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", myIvar); }]; Wrong
  • 20. Gestion mémoire Capturer un objet __block ne le retient pas ! MyClass.h MyObject* myObject; int myIvar; MyClass.m __block MyClass* selfBlock = self; myObject = [[MyObject alloc] initWithBlock:^{ NSLog(@"%i", selfBlock-> myIvar); }]; Right
  • 21. Bonus Effet Bounce des UIAlertView v.transform = CGAffineTransformMakeScale(0.7, 0.7); v.alpha = 0; [self.view addSubview:v]; [UIView animateWithDuration:0.2 animations:^{ v.transform = CGAffineTransformMakeScale(1.25, 1.25); v.alpha = 0.6; } completion:^(BOOL finished) { [UIView animateWithDuration:0.15 animations:^{ v.transform = CGAffineTransformMake(0.85, 0.85); v.alpha = 1; } completion:^(BOOL finished) { [UIView animateWithDuration:0.1 animations:^{ v.transform = CGAffineTransformIdentity; } completion:NULL]; }]; }];
  • 22. Bonus UIAlertView* alert = [[UIAlertView alloc] init... delegate: nil ...]; [alert showWithCompletion:^(NSInteger index) { if (index == 1) { [UIApplication openURL:myURL]; } }]; [alert release]; N’existe pas! Codons le
  • 23. Bonus @interface BlockAlertView : UIAlertView <UIAlertViewDelegate> { void (^completionBlock_)(NSInteger); } - (void)showWithCompletion:(void (^)(NSInteger index))completion; @end
  • 24. Bonus @implementation BlockAlertView - (void)showWithCompletion:(void (^)(NSInteger index))completion { completionBlock_ = [completion copy]; self.delegate = self; [self show]; } - (void)alertView:(UIAlertView*)alert clickedButtonAtIndex:(NSInteger)index { completionBlock_(index); [completionBlock_ release]; completionBlock_ = nil; } - (void)alertViewCancel:(UIAlertView*)alert { completionBlock_(-1); [completionBlock_ release]; completionBlock_ = nil; } @end
  • 26. Introduction • Nouveaux éléments de langage (Blocks) • Une bibliothèque de fonctions (libdispatch) • Amélioration et simplification de la gestion de la concurrence
  • 27. Introduction - Pourquoi GCD • Complexité du multi-threading • Multiplication des Cores sur toutes les plateformes • Mauvaise gestion des ressources
  • 28. Introduction - GCD c’est quoi? • Gestion des threads au niveau du système • Gestion des problématiques de concurrence (lock, semaphore...)
  • 29. libdispatch - Queues • Liste FIFO de Blocks à exécuter • Ajout de Block FIFO • Lancement de l’exécution d’un Block FIFO • Gère les threads qui exécutent les Blocks
  • 30. Queues • Trois types de Queues : • Main Queue (Main Thread) • Private Dispatch Queue (exécution série) • Global Dispatch Queue (exécution parallèle)
  • 31. Private Dispatch Queue Current Thread Block 3 Ajoute Block 1 Block 2 puis Block 2 puis Block 3 Exécute Block 1 Block 1 puis Block 2 puis Block 3 Private queue Other Thread
  • 32. Global Dispatch Queue Puis Block 3 sur Current Thread le premier thread qui sera libéré potentiellement avant la fin Block 3 du Block 1 Ajoute Block 1 Block 2 puis Block 2 puis Block 2 puis Block 3 Block 1 Lance Block 1 Global queue Thread Auto Thread Auto
  • 33. Queues • Deux types d’exécution: • Synchrone • Asynchrone
  • 34. libdispatch - import • Comment utiliser libdispatch dans son projet? #import <dispatch/dispatch.h>
  • 35. libdispatch - queue • Comment créer une queue ? dispatch_queue_t main_queue; dispatch_queue_t serial_queue; dispatch_queue_t global_queue; // main queue main_queue = dispatch_get_main_queue(); // private dispatch queue serial_queue = dispatch_queue_create("com.example.myQueue", NULL); // global dispath queue global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_release(serial_queue);
  • 36. libdispatch - étude de cas • Process en background + mise à jour de l’UI dispatch_queue_t background_queue; dispatch_queue_t main_queue; backgroung_queue = dispatch_queue_create("com.example.myQueue", NULL); main_queue = dispatch_get_main_queue(); dispatch_async(background_queue, ^{ int result = hardWorkInBackground(); dispatch_async(main_queue, ^{ updateUIWithData(result); }); }); dispatch_release(background_queue);
  • 37. libdispatch - étude de cas • Traitement sur les éléments d’un tableau dispatch_queue_t global_queue; global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); NSArray* mySudokuGrid = ...; dispatch_apply(nb_iteration,global_queue,^(size_t index){ MyCell* cell = [mySudokuGrid objectAtIndex:index]; [cell computeSolutions]; });
  • 38. libdispatch - étude de cas • Comment remplacer les locks ? - (void)updateImageCacheWithImage:(UIImage*)img { NSLock* l = self.cacheLock; [l lock]; // Section critique, ne pas ajouter deux fois la même image! if ([self.imageCache containsObj:img]) { [l unlock]; // Surtout ne pas oublier! return; } [self.imageCache addObj:img]; [l unlock]; }
  • 39. libdispatch - étude de cas • Simplement par une Queue! - (void)updateImageCacheWithImage:(UIImage*)img { dispatch_sync(serial_queue,^{ // Section critique, ne pas ajouter deux fois la même image! if ([self.imageCache containsObj:img]) { return; } [self.imageCache addObj:img]; }); } ou mieux : dispatch_async
  • 40. libdispatch - deadlock • Attention aux deadlock dispatch_sync(queue, ^{ // Some code ! dispatch_sync(queue, ^{ // Another block }); }); Block 2 ! Block 1 Private queue Other Thread
  • 41. API haut niveau • Grand Central Dispatch ajoute à l’existant • NSOperation • NSOperationQueue
  • 42. API haut niveau • NSBlockOperation • Classe concrête de NSOperation • Gère l’exécution en parallèle de un ou plusieurs Blocks
  • 43. API haut niveau • NSOperationQueue • C’est elle qui gère l’exécution des opérations • Peut être configurée
  • 44. API haut niveau - base • Créer et lancer une opération via NSOperationQueue : NSOperationQueue* aQueue = [[NSOperationQueue alloc] init]; NSBlockOperation* blockOp = [NSBlockOperation blockOperationWithBlock:^{ // Some Code }]; [aQueue addOperation:blockOp]; ... [aQueue addOperationWithBlock:^{ // Another Block }]; ... [aQueue release];
  • 45. API haut niveau - dépendance • Comment indiquer des dépendances entre opérations? NSBlockOperation* op1 = ...: NSBlockOperation* op2 = ...: [op2 addDependencie:op1];
  • 46. API haut niveau - iOS Sur iOS les NSOperationQueue ! n’utilisent pas Grand Central Dispatch
  • 47. Références http://developer.apple.com http://thirdcog.eu/pwcblocks/ Contacts pierre.duchene@niji.fr thomas.dupont@niji.fr
  • 48. CocoaHeads #1 julien@cocoaheads.fr http://cocoaheads.fr thomas.dupont@cocoaheads.fr Traduction automatique et intelligente d’applications Cocoa Mail : olivier@foodreporter.net Web : www.foodreporter.fr GitHub : github.com/AliSoftware A la découverte de Grand Central Dispatch Mail : thomas.dupont@niji.fr Mail : pierre.duchene@niji.fr Web : www.niji.fr Partenaire