J'ai regardé quelques présentations de WWDC 2010 et lu la plupart des documents sur les blocs et la concurrence et j'ai quelques questions concernant l'utilisation de blocs avec des files d'attente en série dans Grand Central Dispatch. J'ai un projet iOS 4 qui a une vue de défilement et un dictionnaire d'informations sur les images - url des images, etc. Je veux utiliser GCD et des blocs pour télécharger les images et les mettre dans mon scrollview sans bloquer le thread principal. J'ai écrit le code suivant qui semble fonctionner :
for (NSDictionary* dict in images)
{
dispatch_async(image_queue, ^{
NSString* urlString = [dict objectForKey:@"url"];
NSURL* url = [NSURL URLWithString:urlString];
NSData* imageData = [[NSData alloc] initWithContentsOfURL:url];
UIImage* image = [UIImage imageWithData:imageData];
UIImageView* imageView = // initialize imageView with image;
dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView addSubview:imageView];
});
[imageData release];
});
}
J'ai deux questions à poser :
-
D'après le guide des concurrences, je ne devrais pas capturer des variables de la portée englobante qui ne sont pas de type scalaire - dans mon code, je capture dict qui est un objet NSDictionary*. Si je ne suis pas autorisé à la capturer, comment dois-je alors écrire le code ? Un bloc ne capture-t-il que les variables de l'espace environnant qui sont effectivement utilisées ?
-
Que se passe-t-il si je quitte le ViewController actuel avant que toutes les images ne soient récupérées dans la file d'attente de la série ? Je ne pense pas qu'ils soient conscients que le ViewController qui les a créés a disparu, alors que se passe-t-il lorsqu'ils exécutent le completion handler où j'insère les vues d'images dans ma scrollview sur le thread principal ? Est-ce que cela provoque une erreur ou quoi ? Et comment puis-je annuler toutes les opérations restantes sur la file d'attente série lorsque mon ViewController disparaît ?
Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées,