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