2013-08-29 2 views
5

Я пытаюсь нетерпеливым нагрузки кучи изображений:SDWebImage изображение нетерпеливых нагрузки

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

Это не скачивая эти изображения. Однако, если я прохожу в пустой блок завершения, например:

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

тогда он работает нормально. Мой вопрос: почему? Есть лучший способ сделать это? Прохождение в пустой блок мне кажется неправильным.

ответ

18

API, который вы используете, является неправильным.

Для предварительной выборки изображений и сохранения их в кеше используйте SDWebImagePrefetcher, который предназначен для этого.

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

В качестве примечания я представил запрос нагрузочного - который только что был слит - для обеспечения присутствия completedBlock в API вы (MIS), используя, таким образом, чтобы другие программисты не будут упасть на тебя с той же ошибкой.

+0

Отлично, спасибо! – 0xSina

+4

FYI, если вы делаете это несколько раз без блоков завершения, вы можете не захотеть использовать 'sharedImagePrefetcher', поскольку он отменяет текущие операции предварительной выборки перед выполнением новых. Я выделяю новый, вместо того, чтобы использовать общий код в своем коде. –

+0

@ EnricoSusatyo это огромный. Спасибо, что поняли это. – kevinl

1

Если вы внимательно посмотрите на -[SDWebImageManager downloadWithURL:options:progress:completed:] implementation, вы найдете строки:

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

Так что да, это не делает ничего, если completionBlock является nil. Зачем? Вероятно, разработчики SDWebImage считали этот метод бесполезным без прохождения этого параметра. Вам лучше создать вопрос GitHub, чтобы спросить их.

+1

Это имеет смысл. Если вы ничего не делаете с изображением, почему вы используете его в первую очередь? Они должны использовать утверждение параметра для принудительного выполнения этого. –

+1

@GabrielePetronella согласен, но способ использования 0xSina вполне естественно. Это недостаток дизайна. – iHunter

+0

Они должны поднять исключение, чтобы сообщить разработчику. Я делаю запрос на тяну. –

0

SDWebImage зафиксировал вопрос завершения блока и это теперь возможно с одной линии Swift:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray)