У меня есть приложение, которое показывает «полноэкранные карты» в UICollectionView
, как Tinder. Карта содержит изображение и текст. Я загружал изображение, используя метод SDWebImage
sd_setImageWithURL
в ячейке UICollectionView
.Изображение Предварительная загрузка в iOS
Однако это не давало мне хорошей производительности, поскольку изображения были в основном загружены, когда пользователь был на карте. Поэтому я очередь SDWebImagePrefetcher
предвыборки сделать это следующим образом: -
func startImagePreloadingOperationForIndex(index:Int)
{
let numberOfImagesToBePreloadedOnEachSide = 20
var previousIndex = index - numberOfImagesToBePreloadedOnEachSide
var nextIndex = index + numberOfImagesToBePreloadedOnEachSide
if previousIndex < 0
{
previousIndex = 0
}
if nextIndex >= currentNewsCollection.count
{
nextIndex = currentNewsCollection.count - 1
}
if previousIndex >= nextIndex || currentNewsCollection.isEmpty
{
return
}
let arrayOfNewsStories = currentNewsCollection[previousIndex...nextIndex]
let arrayOfImageURLs = arrayOfNewsStories.map({ ImageUtility.getImageStringForNewsStory($0) })
SDWebImagePrefetcher.sharedImagePrefetcher().prefetchURLs(arrayOfImageURLs, progress: { (x, y) -> Void in
}) { (x, y) -> Void in
}
}
Эта функция вызывается, когда пользователь попадает на конкретную карту. Очередь предварительной выборки автоматически управляет загрузкой изображений в кеш, поэтому мне не нужно беспокоиться об этом. Наряду с этим я также использую sd_setImageWithURL
в cellForItemAtIndexPath
, чтобы получить загруженное изображение из кеша.
Это лучшее решение, так как теперь я предварительно загружаю изображения, когда пользователь находится на карте. Однако это параллельная очередь. Это означает, что изображение нет. index + 20 может быть загружен до текущего изображения, и пользователю может потребоваться дождаться изображения. Также приложение становится немного отсталым, если пользователь прокручивает более 50 карт, а использование памяти также продолжает расти.
Может ли кто-нибудь предложить улучшения этого или лучшего алгоритма?
Благодаря
Спасибо, Майкл. Как добавить мою собственную очередь решить проблему, поскольку SDWebImage обеспечивает оптимизированную очередь. Я попытался использовать последовательную очередь, но это оказалось слишком медленным. Я также пытался играть с количеством загружаемых изображений, но это не помогло –