Problema con GCD y demasiados hilos

Tengo una clase de cargador de imágenes que proporciona cargas NSURL e imágenes de la web y ejecuta el bloque de finalización. El código es bastante simple

- (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);
        });
    });

}

Cuando reemplace

dispatch_async(_queue, ^{

con comentarios

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

Las imágenes se cargan mucho más rápido, lo cual es bastante lógico (antes de que las imágenes se carguen una a la vez, ahora se cargan varias de manera simultánea). Mi problema es que tengo quizás 50 imágenes y llamo downloadImageWithURL: completed: método para todas ellas y cuando uso la cola global en lugar de _queue mi aplicación finalmente se bloquea y veo que hay más de 85 subprocesos. ¿El problema puede ser que mi llamada dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0) 50 veces seguidas hace que GCD cree demasiados subprocesos? Pensé que gcd maneja todas las pisadas y se asegura de que el número de subprocesos no sea enorme, pero si no es así, ¿hay alguna forma en que pueda influir en el número de subprocesos?

Respuestas a la pregunta(3)

Su respuesta a la pregunta