2013-07-10 2 views
2

Мне нужно реализовать некоторую ленивую загрузку изображений в таблицеView, и я много читал о SDWebImage, но я не мог понять, как это работает. Надеюсь, я смогу получить ответы здесь.Понимание SDWebImage и ленивой загрузки

Итак, с SDWebImage, что произойдет, если я прокручу очень быстро, скажем, 100 ячеек/секунду? Если эти изображения не сохранены в памяти, будет ли SDWebImage загружать все эти изображения, сохранять их и распаковывать?

Могу ли я сообщить SDWebImage для сохранения изображений в «Библиотека/Поддержка приложений» вместо сохранения их в директории кеша? Мне нужны только первые снимки для ленивых нагрузок.

ответ

7

Я бы не назвал его «ленивой загрузкой» в нормальном смысле, поскольку SDWebImage не определяет, загружаются ли ваши изображения лениво. SDWebImage загружает изображения, когда вы вызываете один из его методов setImageWithURL: (варианты включают местозаполнитель, без заполнителя, блок завершения, блок выполнения и т. Д.). Вы можете вызвать метод только тогда, когда ячейка будет нарисована/отображена, именно это определяет, не ленивая загрузка. Если вы сначала создаете все свои ячейки (не в cellForRowAtIndexPath: или эквивалентном методе), тогда вы не будете ленивой загрузкой. SDWebImage не имеет к этому никакого отношения.

Что делает SDWebImage, загружает изображение в фоновом потоке, поэтому вы не блокируете пользовательский интерфейс/основной поток, когда эта загрузка продолжается. Кроме того, он также будет кэшировать все загруженные вами изображения и никогда не будет повторно загружать изображение с одного и того же URL (это плюс плюс минус). Вы можете очистить кеш, основанный на времени, и я полагаю, что основной ветвь добавила поддержку ограничения для кеша (это актуально, если вы используете CocoaPods, поскольку он не по умолчанию не «мастер», и вы выиграли 't получить эту функциональность - они могли бы обновить версию/тег CocoaPods, вам нужно будет подтвердить).

Теперь, для получения дополнительной информации - вы прочтете литературу, в которой упоминается, что iOS NSURLCache (5.0+) уже реализует кэширование файлов необработанных HTTP-ответов. Однако это означает, что каждый раз, когда изображение вытягивается из кеша, оно должно преобразовывать необработанные данные в UIImage. SDWebImage, с другой стороны, кэширует представление UIImage, которое экономит ваши накладные расходы.

Что касается изменения папки назначения, могу ли я спросить, почему? SDWebImage кэширует изображения полу-навсегда (в зависимости от настроек вашего кеша, если вы решите их установить). Сохраненное местоположение не влияет на кеширование - вы можете изменить код, чтобы сохранить его в другом месте. Ниже приводится соответствующий раздел из SDImageCache.m, что вы могли бы изменить - нужно будет пересмотреть остальную часть кода SDWebImage, чтобы убедиться, что он ничего не нарушал:

// Init the disk cache 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace]; 

Надеется, что это помогает, дайте мне знать, если вы нужна дополнительная информация.

UPDATE: Для того, чтобы конкретно ответить на этот вопрос:

Так с SDWebImage, что будет, если я случилось прокручивать очень быстро, скажем, 100 клеток/второй? Если эти изображения не сохранены в памяти, будет ли SDWebImage загружать все эти изображения, сохранять их и распаковывать?

Эти изображения будут загружены (и сохранены в кэш диска, так как это поведение по умолчанию). Данные изображения будут выброшены из памяти при повторном использовании ваших ячеек (при условии, что вы используете dequeueReusableCellWithIdentifier:). Если вы прокрутите резервную копию, SDWebImage узнает, уже загружен ли этот конкретный URL-адрес и будет использовать версию, хранящуюся в кеше диска. Если вы прокручиваете так быстро, что загрузка не была выполнена до того, как эта ячейка была повторно использована, тогда, когда вы прокрутите резервную копию, она снова попытается загрузить изображение. Промыть и повторить.

+0

Wow это помогло мне много! Должен ли я отменить загрузку самостоятельно или, может быть, это не проблема? Я думал, что, если я начну обращаться ко многим запросам сразу, это займет много времени, чтобы получить видимые изображения ячеек. – Toydor

+0

Что касается папки хранения, мои изображения никогда не меняются, поэтому я хочу хранить их на постоянной основе, но, возможно, для хранения кеша достаточно. Приятно знать, как я могу его изменить, но, как вы сказали, я просто должен проверить, не сломает ли это что-либо. – Toydor

+0

Отмена загрузки не является большой проблемой, по той же причине, о которой я упоминал в «обновленном» параграфе - в основном, если вы повторно используете ячейки, UIImageView в этих ячейках повторно используется и из моего краткого чтения каждый раз, когда вы вызов 'setImageWithURL:' он сначала отменяет все операции, ранее связанные с этим UIImageView, так что нет, у вас нет сотни операций загрузки в очереди. –

0

я недавно реализовали его с UITableView

вы должны сделать 3 вещи, и он будет обрабатывать все само по себе

1.Add SDWebImage полную папку в проекте (не забудьте проверить копирования флажок при добавлении) 2.Add эту строку в верхней части этого класса, где вы хотите, чтобы справиться с lazyloading #import UIImageView + WebCache.h».

  1. , наконец, использовать эту линию в tableviewcell

[cell.imageView setImageWithURL: (NSURL *) placeholderImage: (UIImage *)]

Вот это :) ура мате. Я также много искал для этой проблемы

Смежные вопросы