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?