TinderのようなUICollectionView
に「フルスクリーンカード」を表示するアプリを開発しました。カードには画像とテキストが含まれています。 UICollectionView
のセルにSDWebImage
のsd_setImageWithURL
メソッドを使用してイメージをロードしていました。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
}
}
ユーザーが特定のカードの上に着地するときに、この関数が呼び出されます。先読みキューは自動的にキャッシュ内のイメージをダウンロードしないように管理しますので、私はそれについて心配する必要はありません。これに加えて、のcellForItemAtIndexPath
を使用して、ダウンロードしたイメージをキャッシュから取得します。
これは、ユーザーがカードにいるときにイメージをプリロードするので、これはより良い解決策です。しかし、これは並列キューです。画像Noを意味します。インデックス+20は、現在の画像とユーザが画像を待たなければならない前にロードすることができる。また、ユーザーが50枚以上のカードをスクロールしてメモリ使用量が増加し続けると、アプリが少し遅くなる。
これ以上の改善点はありますか?
おかげ
マイケルに感謝します。 SDWebImageは最適化されたキューを提供するので、自分のキューを追加することでどのように問題が解決されるのでしょうか。私はシリアルキューを使用しようとしましたが、それは遅すぎることが判明していました。私はまた、ロードされている画像の数で遊んでみたが、それは助けていなかった –