NSData
a toujours eu une méthode très pratique appelée +dataWithContentsOfURL:options:error:
. Bien que pratique, elle bloque également l'exécution du thread actuel, ce qui signifie qu'elle était pratiquement inutile pour le code de production (en ignorant NSOperation
). J'utilisais cette méthode si rarement que j'avais complètement oublié son existence. Jusqu'à récemment.
La façon dont je récupère des données des tubes est l'approche standard avec NSURLConnectionDelegate
: Écrire une classe de téléchargement qui gère les différentes méthodes de NSURLConnectionDelegate
, accumuler progressivement des données, gérer les erreurs, etc. Je la rends généralement assez générique pour être réutilisée pour autant de requêtes que possible.
Disons que ma classe de téléchargement typique fait quelque part autour de 100 lignes. C'est 100 lignes pour faire de manière asynchrone ce que NSData
peut faire de manière synchrone en une ligne. Pour plus de complexité, cette classe de téléchargement a besoin de son propre protocole délégué pour communiquer l'achèvement et les erreurs à son propriétaire, et ce dernier doit implémenter ce protocole d'une certaine manière.
Maintenant, entrer Grand Central Dispatch, et je peux faire quelque chose d'aussi fantastiquement simple que :
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSData* data = [NSData dataWithContentsOfURL:someURL];
// Traiter les données, également de manière asynchrone...
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Retour au thread principal pour les mises à jour de l'interface utilisateur, etc.
});
});
Et je peux insérer ce truc n'importe où je veux, directement. Pas besoin d'une classe de téléchargement, pas besoin de gérer les méthodes de délégué de connexion : Données asynchrones faciles en quelques lignes seulement. La disparité entre cette approche et mon approche avant GCD est d'une ampleur suffisante pour déclencher l'Alarme Trop Beau pour Être Vrai.
Ainsi, ma question : Y a-t-il des inconvénients à utiliser NSData
+ GCD pour des tâches simples de téléchargement de données au lieu de NSURLConnection
(en supposant que je ne me soucie pas de choses comme la progression du téléchargement) ?