J'ai regardé certaines des présentations de la WWDC 2010 et j'ai également lu la plupart des documents sur les blocs et la simultanéité et j'ai quelques questions concernant l'utilisation de blocs avec des files d'attente série dans Grand Central Dispatch. J'ai un projet iOS 4 qui a une scrollview et un dictionnaire d'informations d'image - urls aux images et ainsi de suite. Je veux utiliser GCD et les blocs pour télécharger les images et les mettre dans mon scrollview ne bloquant pas le fil principal. J'ai écrit le code suivant qui semble fonctionner:iOS 4 questions GCD
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:
Selon le guide d'accès concurrentiel je ne devrais pas saisir les variables de la portée englobante qui sont des types non scalaires - Dans mon code, je capture dict qui est un objet NSDictionary *. Si je ne suis pas autorisé à le capturer, comment puis-je écrire le code? Est-ce qu'un bloc capture uniquement les variables de la portée englobante qui sont réellement 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 d'expédition en série? Je ne pense pas qu'ils sont conscients que le ViewController qui les a créés est parti alors que se passe-t-il lorsqu'ils exécutent le gestionnaire de complétion où j'insère les vues de l'image dans mon scrollview sur le thread principal? Cela provoque-t-il 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?
Meilleures salutations,
J'aimerais également voir quelques bonnes pratiques. –