Problem mit GCD und zu vielen Threads

Ich habe eine Image-Loader-Klasse, die mit NSURL-Ladevorgängen und Image aus dem Web versorgt und Completion-Block ausführt. Code ist eigentlich ganz einfach

- (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion
{
    dispatch_async(_queue, ^{
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        UIImage *image = nil;
        NSURL *URL = [NSURL URLWithString:URLString];
        if (URL) {
            image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
        }  
        dispatch_async(dispatch_get_main_queue(), ^{
            completion(image, URLString);
        });
    });

}

Wenn ich ersetze

dispatch_async(_queue, ^{

mit auskommentiert

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

Bilder werden viel schneller geladen, was sehr logisch ist (bevor Bilder einzeln geladen wurden, werden jetzt mehrere gleichzeitig geladen). Mein Problem ist, dass ich vielleicht 50 Bilder habe und die downloadImageWithURL: completion: -Methode für alle benenne. Wenn ich die globale Warteschlange anstelle von _queue verwende, stürzt meine App schließlich ab und ich sehe, dass es 85+ Threads gibt. Kann das Problem sein, dass mein Aufruf von dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0) 50-mal hintereinander bewirkt, dass GCD zu viele Threads erstellt? Ich dachte, dass gcd alle Schritte erledigt und sicherstellt, dass die Anzahl der Threads nicht zu groß ist, aber wenn dies nicht der Fall ist, kann ich dann die Anzahl der Threads beeinflussen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage