Ich habe eine App entwickelt, die "Vollbild-Karten" in einem UICollectionView
wie Tinder zeigt. Die Karte enthält ein Bild und etwas Text. Ich habe das Bild geladen SDWebImage
's sd_setImageWithURL
Methode in der Zelle UICollectionView
.Bild Vorladen in iOS
Allerdings gab mir das keine gute Leistung, da die Bilder meist geladen wurden, wenn der Benutzer auf einer Karte war. Ich habe daher die SDWebImagePrefetcher
Prefetch-Warteschlange, dies zu tun, wie folgt: -
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
}
}
Diese Funktion, wenn der Benutzer landet auf einer bestimmten Karte genannt wird. Die Vorablesewarteschlange verwaltet automatisch, dass keine Bilder im Cache heruntergeladen werden, sodass ich mich nicht darum kümmern muss. Zusammen mit diesem verwende ich auch die sd_setImageWithURL
in cellForItemAtIndexPath
, um das heruntergeladene Bild aus dem Cache abzuholen.
Dies ist eine bessere Lösung, da ich jetzt Bilder vorspeichern, wenn der Benutzer auf einer Karte ist. Dies ist jedoch eine parallele Warteschlange. Was bedeutet Bild-Nr. index + 20 könnte vor dem aktuellen Bild geladen werden und der Benutzer müsste auf das Bild warten. Auch wird die App ein wenig nach hinten verschoben, wenn der Benutzer mehr als 50 Karten scrollt und die Speicherauslastung ebenfalls steigt.
Kann jemand bitte Verbesserungen zu diesem oder einem besseren Algorithmus vorschlagen?
Dank
Danke Michael. Wie würde das Hinzufügen meiner eigenen Warteschlange das Problem lösen, da SDWebImage eine optimierte Warteschlange bereitstellt. Ich habe versucht, eine serielle Warteschlange zu verwenden, aber das erwies sich als zu langsam. Ich habe auch versucht, mit der Anzahl der geladenen Bilder herumzuspielen, aber das hat nicht geholfen –