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) { }];
}

тогава работи добре. Въпросът ми е: защо? Има ли по-добър начин да направите това? Минаването в празен блок не ми се струва правилно.


person 0xSina    schedule 29.08.2013    source източник


Отговори (3)


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, който използвате (неправилно), така че други програмисти да не ви въвлекат в същата грешка.

person Gabriele Petronella    schedule 29.08.2013
comment
За информация, ако правите това няколко пъти без блоковете за завършване, може да не искате да използвате sharedImagePrefetcher, тъй като той ще отмени текущо изпълняваните операции за предварително извличане, преди да извърши новите. Разпределям нов, вместо да използвам споделения в моя код. - person Enrico Susatyo; 05.01.2016
comment
@EnricoSusatyo, това е огромно. Благодаря, че изясни това. - person kevinl; 22.12.2016
comment
API е дефектен. Prefetcher е всичко или нищо наведнъж. Не винаги е възможно (или удобно) да групирате куп заявки предварително. Няма причина, поради която този споделен мениджър да не може да приеме допълнителни заявки за предварително извличане, без да издуха всички предишни заявки. Странно е да се налага да се инициират отделни програми за предварително извличане. - person CIFilter; 03.05.2017

Ако разгледате внимателно -[SDWebImageManager downloadWithURL:options:progress:completed:] внедряването, вие ще намеря редовете:

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, за да ги попитате.

person iHunter    schedule 29.08.2013
comment
Има смисъл. Ако не правите нищо с изображението, защо го използвате на първо място? Те обаче трябва да използват твърдение за параметър, за да наложат това. - person Gabriele Petronella; 29.08.2013
comment
@GabrielePetronella Съгласна съм, но смятам, че начинът на използване на 0xSina е напълно естествен. Това е дефект в дизайна. - person iHunter; 29.08.2013
comment
Те трябва да направят изключение, за да информират разработчика. Правя заявка за изтегляне. - person Gabriele Petronella; 29.08.2013
comment
@GabrielePetronella Искам да зареждам с нетърпение. Имам табличен изглед с куп изображения, 90% от тях не се показват, докато потребителят не превърти надолу. Искам да ги заредя превантивно. Очевидно ОЩЕ не ми трябват изображенията, затова не ми трябва блокът. Просто искам да се уверя, че изображенията са заредени. - person 0xSina; 29.08.2013
comment
@GabrielePetronella Предполагам, че това, което питам, е, ако искате да заредите изображения (уверете се, че са изтеглени и кеширани), как бихте го направили? - person 0xSina; 29.08.2013
comment
@0xSina виж отговора ми. - person Gabriele Petronella; 29.08.2013

SDWebImage поправи проблема с блока за завършване и това вече е възможно с един ред на Swift:

SDWebImagePrefetcher.shared().prefetchURLs(urlArray)
person Justin Vallely    schedule 04.02.2018