Problema com o GCD e muitos tópicos
Eu tenho uma classe de carregador de imagem que forneceu com cargas NSURL e imagem da web e executa o bloco de conclusão. O código é realmente muito simples
- (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);
});
});
}
Quando eu substituir
dispatch_async(_queue, ^{
com comentou
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
As imagens estão sendo carregadas muito mais rápido, o que é bastante lógico (antes que as imagens fossem carregadas uma de cada vez, agora um grupo delas está sendo carregado simultaneamente). Meu problema é que eu tenho talvez 50 imagens e chamo o método downloadImageWithURL: completion: para todos eles e quando eu uso a fila global em vez de _queue meu aplicativo eventualmente falha e vejo que há mais de 85 threads. O problema pode ser que a minha chamada dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0) 50 vezes seguidas faz com que o GCD crie muitos threads? Eu pensei que gcd lida com todos os passos e garante que o número de threads não é enorme, mas se não for o caso, há alguma maneira que eu possa influenciar o número de segmentos?