2013-08-29 1 views
5

sto cercando di carico desiderosi gruppo di immagini:SDWebImage caricare immagini desiderosi

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:nil]; 
} 

non è il download di queste immagini. Tuttavia, se passo in un blocco di completamento vuoto, così:

for (NSDictionary *s in things) { 
    [manager downloadWithURL:[NSURL URLWithString:s[photo]] 
        options:0 
        progress:nil 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { }]; 
} 

quindi funziona bene. La mia domanda è: perché? C'è un modo migliore per farlo? Passare in un blocco vuoto non mi sembra giusto.

risposta

18

L'API che si sta utilizzando non è quella corretta.

Per eseguire il precaricamento delle immagini e memorizzarle nella cache, utilizzare SDWebImagePrefetcher per questo scopo.

NSMutableArray * urls = [NSMutableArray arrayWithCapacity:things.count]; 
for (NSDictionary *s in things) { 
    [urls addObject:[NSURL URLWithString:s[photo]]]; 
} 
[[SDWebImagePrefetcher sharedImagePrefetcher] prefetchURLs:urls]; 

Come nota a margine ho presentato una richiesta di pull - che è appena stata fusa - per far rispettare la presenza di un completedBlock nell'API sei (MIS) utilizzando, in modo che altri programmatori non lo farà ti cade nel tuo stesso errore

+0

Perfetto, grazie! – 0xSina

+4

FYI, se lo fai più volte senza i blocchi di completamento potresti non voler usare 'sharedImagePrefetcher', poiché annullerà le operazioni di prefetch correntemente in esecuzione prima di eseguire quelle nuove. Ne assegno uno nuovo invece di usare quello condiviso nel mio codice. –

+0

@EnricoSusatyo è enorme. Grazie per averlo chiarito. – kevinl

1

Se si guarda con attenzione al -[SDWebImageManager downloadWithURL:options:progress:completed:] implementation, troverete le linee:

if (!url || !completedBlock || (!(options & SDWebImageRetryFailed) && isFailedUrl)) 
{ 
    if (completedBlock) 
    { 
     // Complain about invalid URL, completely irrelevant to us at this point. 
     ... 
    } 
    return operation; 
} 

Quindi sì, non fa nulla se completionBlock è nil. Perché? Probabilmente, gli sviluppatori di SDWebImage hanno ritenuto inutile quel metodo senza che fosse passato quel parametro. Faresti meglio a creare un problema su GitHub per chiederlo.

+1

'logico. Se non stai facendo nulla con l'immagine, perché la stai usando in primo luogo? Dovrebbero usare un parametro per affermare questo però. –

+1

@GabrielePetronella Sono d'accordo, ma il modo in cui utilizzo 0xSina è completamente naturale. È un difetto di progettazione. – iHunter

+0

Dovrebbero generare un'eccezione per informare lo sviluppatore. Sto facendo una richiesta di pull. –

0

SDWebImage ha risolto il problema blocco completamento e questo è ora possibile con una singola linea di Swift:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray)