2013-08-29 10 views
5

Próbuję chętny pęczek obciążenia obrazów:SDWebImage zdjęć chętny obciążenia

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

To nie pobierając te obrazy. Jeśli jednak przejdę w pustym bloku zakończenia, tak:

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

to działa dobrze. Moje pytanie brzmi: dlaczego? Czy jest lepszy sposób to zrobić? Przejście w pustym bloku nie wydaje mi się właściwe.

Odpowiedz

18

Używany interfejs API nie jest poprawny.

Aby pobrać wstępnie obrazy i zapisać je w pamięci podręcznej, należy użyć SDWebImagePrefetcher przeznaczonej do tego.

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

marginesie I złożył wniosek Pull - która właśnie została scalona - egzekwowanie obecność completedBlock w API jesteś (mis) przy użyciu, tak że inni programiści nie będzie wpadniesz w ten sam błąd.

+0

Idealne, dzięki! – 0xSina

+4

FYI, jeśli robisz to wiele razy bez bloków zakończenia, możesz nie chcieć używać 'sharedImagePrefetcher', ponieważ spowoduje to anulowanie aktualnie działających operacji pobierania wstępnego przed wykonaniem nowych. Przydzielam nowy zamiast używać współdzielonego w moim kodzie. –

+0

@EnricoSusatyo to jest ogromne. Dzięki za wyczyszczenie tego. – kevinl

1

Jeśli spojrzymy uważnie na -[SDWebImageManager downloadWithURL:options:progress:completed:] implementation znajdziesz wiersze:

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

Więc tak, że nie robi nic, jeśli completionBlock jest nil. Czemu? Prawdopodobnie programiści SDWebImage uznali, że metoda ta jest bezużyteczna bez tego parametru. Lepiej stwórz zagadnienie GitHub, aby je zadać.

+1

To ma sens. Jeśli nie robisz nic z obrazem, dlaczego używasz go w pierwszej kolejności? Powinny jednak użyć asercji parametrów, aby to wymusić. –

+1

@GabrielePetronella Zgadzam się, ale sposób 0xSina jest całkowicie naturalny. To wada konstrukcyjna. – iHunter

+0

Powinny one zgłosić wyjątek, aby poinformować programistę. Robię żądanie wyciągnięcia. –

0

SDWebImage ustaliła kwestię zakończenia bloku i teraz jest to możliwe z jednej linii SWIFT:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray)