ns operationqueue

20
CTO Youboox @vdaubry iOS et RoR Vincent Daubry

Upload: cocoaheads-france

Post on 15-May-2015

2.672 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Ns operationqueue

• CTO  Youboox  • @vdaubry  •  iOS  et  RoR  

Vincent  Daubry  

Page 2: Ns operationqueue

A quoi ça sert ? •  Gérer le multithreading, ne pas bloquer le main thread

•  Cas d'usage numéro 1 : appels réseaux

•  Article de Jeff Lamarche de 2010 qui déconseille l’utilisation de thread pour lancer des appels réseaux synchrone

•  « This is Apple's polite way of saying "don't use threads for networking, you idiot". »

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 2

*  h;p://iphonedevelopment.blogspot.fr/2010/05/downloading-­‐images-­‐for-­‐table-­‐without.html  

Page 3: Ns operationqueue

A quoi ça sert ? Les frameworks « modernes » utilise des operations pour faire les appels réseaux. On utilise donc des appels assynchrone pour lancer… des [NSURLConnection sendAsynchronousRequest] ?

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 3

Page 4: Ns operationqueue

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 4

Page 5: Ns operationqueue

A quoi ça sert ? •  Il y a 2 raisons :

La performance : « Event-driven code is more complex than code using blocking threads, but it delivers the highest network performance. »

Mais surtout :

–  Une queue permet un contrôle très fin sur les appels : priorité, dépendances, appels concurrents, etc

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 5

Page 6: Ns operationqueue

Un peu de théorie •  Lancer des thread à la main est facile

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 6

•  Mais : –  Ce n’est pas scalable (gestion du CPU et de la mémoire) –  Pas adapté aux CPU multicoeurs

•  A réserver à des cas très particulier d’appli temps réels…

•  En conlusion : Please don’t do it.

Page 7: Ns operationqueue

Un peu de théorie

•  La bonne façon de faire est d’utiliser les queue fournit par le SDK : dispatch queue et operation queue

•  Dispatch queue (GCD) : approche bas niveau •  Operation queue : approche haut niveau

•  Les operations sont des simple objets •  On peut faire pleins de choses sympathiques avec ça

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 7

Page 8: Ns operationqueue

NSOperation •  NSOperation : moyen recommandé de gérer les appels en tache de

fond

•  Une operation est une sous-classe de NSOperation

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 8

Page 9: Ns operationqueue

NSOperation •  Une operation a une methode main

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 9

Page 10: Ns operationqueue

NSOperationQueue •  Une job queue : NSOperationQueue •  Un simple array d’operation

•  Par défaut les operations sont exécutées dans l’ordre dès qu’on les ajoute à la queue

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 10

Page 11: Ns operationqueue

Dans la vrai vie : les blocks

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 11

C’est  tout  ;)  

Page 12: Ns operationqueue

Le sucre •  La queue offre un contrôle très fin sur les operations :

–  Choisir le nombre d'operations simultanées

–  Priorité d’exécution des jobs

–  Mettre en pause le démarrage de nouvelles operations

•  Une operation est KVO compliant :

–  Etat du job (isCanceled , isConcurrent, isFinished)

–  Completion block

•  Une operation peut avoir une liste d’operations dont elle dépend

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 12

Page 13: Ns operationqueue

AFNetworking

•  Chaque appel est une operation

•  Une queue pour lancer les operations

•  Chaque operation ouvre une connection assynchrone

•  Operations et blocks = callbacks

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 13

Page 14: Ns operationqueue

AFNetworking

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 14

•  Exemple : enqueueBatchOfHTTPRequestOperationsWithRequests

•  Pour chaque requête il y a un completion block (suivre l’avancement)

•  Chaque requête est ajouté comme une dépendance du batch

Page 15: Ns operationqueue

Attention au MainThread… •  Penser à lancer vos opérations de mise à jour de l’interface sur le

main thread !

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 15

Page 16: Ns operationqueue

Attention à la mémoire…

•  Chaque opération retient les objets qui sont alloués durant son exécution

•  Quand on définit des dépendances entre opérations la mémoire n’est libéré que lorsque toutes les opérations soient terminées

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 16

Page 17: Ns operationqueue

MKNetworkKit

•  Et si votre appli fait des appels long en tache de fond ? (ex: téléchargement)

•  3G = 2 connexions concurrentes max … (edge 1 connection)

•  La queue est placée dans un singleton, toute l'appli a accès les appels réseau

•  Permet de faire varier le nombre d'appels concurrent en fonction du reseau

•  Permet d'affecter un niveau de priorité aux appels

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 17

Page 18: Ns operationqueue

MKNetworkKit

•  La queue est en mémoire

•  On ne peut pas sérialiser un block (?)

•  Mais on peut serialiser une opération!

•  Pourquoi faire ? –  Exemple : Quand on perd le réseau les operations sont sauvés

et executés quand on revient online

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 18

Page 19: Ns operationqueue

MKNetworkKit

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 19

Page 20: Ns operationqueue

MKNetworkKit

18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 20