Ich habe mir einige der Präsentationen der WWDC 2010 angesehen und auch die meisten Dokumente zu Blöcken und Gleichzeitigkeit gelesen und habe ein paar Fragen zur Verwendung von Blöcken mit seriellen Warteschlangen in Grand Central Dispatch. Ich habe ein iOS 4 Projekt, das einen Scrollview und ein Wörterbuch mit Bildinformationen hat - Urls zu den Bildern und so weiter. Ich möchte GCD und Blöcke verwenden, um die Bilder herunterzuladen und sie in meinem Scrollview zu platzieren, damit der Hauptthread nicht blockiert wird. Ich habe den folgenden Code geschrieben, der zu funktionieren scheint:
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];
});
}
Ich habe zwei Fragen:
-
Laut dem Gleichzeitigkeitsleitfaden sollte ich keine Variablen aus dem umschließenden Bereich erfassen, die nicht skalare Typen sind - in meinem Code erfasse ich dict, das ein NSDictionary*-Objekt ist. Wenn ich es nicht erfassen darf, wie sollte ich dann den Code schreiben? Erfasst ein Block nur Variablen aus dem umschließenden Bereich, die tatsächlich verwendet werden?
-
Was passiert, wenn ich den aktuellen ViewController verlasse, bevor alle Bilder über die serielle Versandwarteschlange abgerufen wurden? Ich glaube nicht, dass sie wissen, dass der ViewController, der sie erstellt hat, weg ist. Was passiert also, wenn sie den Completion-Handler ausführen, bei dem ich die Bildansichten in meine Scrollview auf dem Hauptthread einfüge? Verursacht das einen Fehler oder was? Und wie kann ich alle verbleibenden Operationen in der seriellen Warteschlange abbrechen, wenn mein ViewController verschwindet?
Mit freundlichen Grüßen,