Проблема с GCD и слишком большим количеством потоков
У меня есть класс загрузчика изображений, который обеспечивает загрузку NSURL и изображение из Интернета и выполняет блок завершения. Код на самом деле довольно прост
- (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);
});
});
}
Когда я заменяю
dispatch_async(_queue, ^{
с закомментированным
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
Изображения загружаются намного быстрее, что вполне логично (раньше эти изображения загружались по одному, теперь куча загружается одновременно). Моя проблема в том, что у меня есть, возможно, 50 изображений, и я вызываю метод downloadImageWithURL: complete: для всех них, и когда я использую глобальную очередь вместо _queue, мое приложение в конечном итоге вылетает, и я вижу, что существует более 85 потоков. Может ли быть проблема в том, что мой вызов dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0) 50 раз подряд заставляет GCD создавать слишком много потоков? Я думал, что gcd обрабатывает все шаги и гарантирует, что количество потоков невелико, но если это не так, есть ли способ повлиять на количество потоков?