Contenu connexe
Similaire à Ns operationqueue
Similaire à Ns operationqueue (20)
Plus de CocoaHeads France
Plus de CocoaHeads France (20)
Ns operationqueue
- 2. 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". »
*
h;p://iphonedevelopment.blogspot.fr/2010/05/downloading-‐images-‐for-‐table-‐without.html
18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 2
- 3. 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
- 4. 18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 4
- 5. 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
- 6. Un peu de théorie
• Lancer des thread à la main est facile
• 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.
18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 6
- 7. 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
- 8. 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
- 10. 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
- 11. Dans la vrai vie : les blocks
C’est
tout
;)
18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 11
- 12. 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
- 13. 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
- 14. AFNetworking
• 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
18/2/13 Copyright © 2012 Youboox.fr | Design by Youboox 14
- 15. 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
- 16. 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
- 17. 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
- 18. 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