Ho una classe di caricamento immagine che fornisce carichi NSURL e immagine dal web ed esegue il blocco di completamento. Il codice è in realtà abbastanza sempliceProblema con GCD e troppi thread
- (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);
});
});
}
Se si sostituisce
dispatch_async(_queue, ^{
con commentate
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
Immagini stanno caricando molto più veloce, wich è abbastanza logico (prima che le immagini verrebbero caricate una alla volta, ora un mucchio di queste si caricano contemporaneamente). Il mio problema è che ho forse 50 immagini e chiamo downloadImageWithURL: completion: metodo per tutti e quando uso la coda globale invece di _queue la mia app alla fine si blocca e vedo che ci sono oltre 85 thread. Il problema può essere che la mia chiamata dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0) 50 volte di seguito fa sì che GCD crei troppi thread? Ho pensato che Gcd gestisca tutto il calpestio e si assicuri che il numero di thread non sia enorme, ma se non è il caso, posso influenzare il numero di thread?
No, questo non ha nulla a che fare con la priorità della coda. GCD crea solo thread aggiuntivi quando i blocchi su thread esistenti per un blocco di code simultanee globali nel kernel per un periodo di tempo non banale. – das
@das grazie Ho apportato alcune modifiche ma non esitare a rendere la mia risposta ancora migliore :) – jackslash