2013-08-29 11 views
5

ich eifrig Last Bündel von Bildern versuchen:SDWebImage eifrig Last Bilder

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

Es ist das Herunterladen nicht, diese Bilder. Wenn ich jedoch einen leeren Completion-Block übergebe:

dann funktioniert es ganz gut. Meine Frage ist: Warum? Gibt es einen besseren Weg, dies zu tun? Einen leeren Block zu passieren, scheint mir nicht richtig zu sein.

Antwort

18

Die API, die Sie verwenden, ist nicht die richtige.

Um Bilder vorab einzulesen und im Cache zu speichern, verwenden Sie SDWebImagePrefetcher, was dafür gedacht ist.

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

Als Randbemerkung ich eine Pull-Anforderung vorgelegt - die fusionierte soeben - das Vorhandensein eines completedBlock in der API Sie sind (mis) mit, so dass andere Programmierer zu erzwingen nicht Sie fallen in denselben Fehler.

+0

Perfekt, danke! – 0xSina

+4

FYI, wenn Sie dies mehrmals ohne die Completion-Blöcke tun, möchten Sie vielleicht nicht den 'sharedImagePrefetcher' verwenden, da es die gerade laufenden Prefetch-Operationen abbricht, bevor Sie die neuen ausführen. Ich weise eine neue zu, anstatt die gemeinsame in meinem Code zu verwenden. –

+0

@ EnricoSusatyo das ist riesig. Danke, dass du das geklärt hast. – kevinl

1

Wenn Sie genau an der -[SDWebImageManager downloadWithURL:options:progress:completed:] implementation anschauen, werden Sie die Zeilen finden:

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

Also ja, es macht nichts, wenn completionBlocknil ist. Warum? Wahrscheinlich haben die SDWebImage Entwickler diese Methode als nutzlos betrachtet, ohne dass dieser Parameter bestanden hat. Sie sollten ein GitHub-Problem erstellen, um sie zu fragen.

+1

Es macht Sinn. Wenn du nichts mit dem Bild machst, warum benutzt du es überhaupt? Sie sollten jedoch eine Parameterbestätigung verwenden, um dies durchzusetzen. –

+1

@GabrielePetronella Ich stimme zu, aber ich 0xSina Art der Verwendung ist völlig natürlich. Es ist ein Designfehler. – iHunter

+0

Sie sollten eine Ausnahme auslösen, um den Entwickler zu informieren. Ich mache eine Pull-Anfrage. –

0

SDWebImage hat den Abschluss Block Problem behoben, und dies ist nun möglich, mit einer einzigen Zeile von Swift:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray)