Problem z GCD i zbyt wieloma wątkami
Mam klasę programu ładującego obraz, który zawiera ładowanie i obraz NSURL z sieci i wykonuje blok zakończenia. Kod jest całkiem prosty
- (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);
});
});
}
Kiedy wymieniam
dispatch_async(_queue, ^{
z komentarzem
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
Obrazy ładują się znacznie szybciej, co jest dość logiczne (zanim obrazy zostaną załadowane pojedynczo, teraz kilka z nich ładuje się jednocześnie). Mam problem z tym, że mam około 50 obrazów i nazywam downloadImageWithURL: complete: metoda dla nich wszystkich i kiedy używam globalnej kolejki zamiast _queue moja aplikacja w końcu ulega awarii i widzę, że istnieje 85+ wątków. Czy problem może polegać na tym, że moje wywołanie dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0) 50 razy z rzędu powoduje, że GCD tworzy zbyt wiele wątków? Myślałem, że gcd obsługuje wszystkie stąpanie i upewnia się, że liczba wątków nie jest duża, ale jeśli tak nie jest, czy jest jakiś sposób, w jaki mogę wpłynąć na liczbę wątków?