Ho sviluppato un'applicazione che mostra "schede a schermo intero" in un UICollectionView
come Tinder. La carta contiene un'immagine e del testo. Stavo caricando l'immagine usando il metodo nella cella di UICollectionView
.Precaricamento immagine in iOS
Tuttavia, questo non mi ha dato buone prestazioni poiché le immagini erano per lo più caricate quando l'utente era su una scheda. Ho quindi usato la coda SDWebImagePrefetcher
prefetch per fare questo nel modo seguente: -
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
}
}
Questa funzione viene chiamata quando le terre utente su una particolare scheda. La coda di prefetching gestisce automaticamente non scaricare le immagini nella cache, quindi non devo preoccuparmene. Insieme a questo sto anche usando il sd_setImageWithURL
in cellForItemAtIndexPath
per raccogliere l'immagine scaricata dalla cache.
Questa è una soluzione migliore poiché ora sto pre-caricando le immagini quando l'utente è su una scheda. Tuttavia questa è una coda parallela. Il che significa immagine n. indice + 20 potrebbe essere caricato prima dell'immagine corrente e l'utente potrebbe dover attendere l'immagine. Anche l'app diventa un po 'più lenta se l'utente scorre oltre 50 carte e anche l'utilizzo della memoria continua a salire.
Qualcuno può suggerire miglioramenti a questo o un algoritmo migliore?
Grazie
Grazie Michael. In che modo aggiungere la mia coda risolve il problema poiché SDWebImage fornisce una coda ottimizzata. Ho provato a utilizzare una coda seriale, ma si stava rivelando troppo lento. Ho anche provato a giocare con il numero di immagini caricate, ma questo non aiutava –