私のcollectionViewはFirebaseからデータを取得します。セル数を設定し、SDWebImageを使用してダウンロードされたセル画像のダウンロードリンクを取得するfirebase変数です。各セルのためにダウンロードするイメージは約60キロバイトですが、collectionviewはロードに約5秒かかります。また、ロードすると、すべてのセルイメージが1番目のセルイメージとして表示され、2番目の後に正しいイメージに変更されます。迅速な3CollectionViewの読み込みが遅い
を使用して
イムは、ここに私のコードは、重い要求のためcellForItemAtIndexPath
を使用しないでください
override func viewDidLoad() {
super.viewDidLoad()
//firebase
FIRDatabase.database().reference(withPath: "Radio").child("numCells").observeSingleEvent(of: .value, with: { (snapshot) in
if let snapInt = snapshot.value as? Int {
self.numCells = snapInt
self.collectionView?.performBatchUpdates(
{
self.collectionView?.reloadSections(NSIndexSet(index: 0) as IndexSet)
}, completion: { (finished:Bool) -> Void in
})
}
}) { (error) in
print(error.localizedDescription)
}
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of items
return numCells
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
let icon = cell.viewWithTag(3) as! UIImageView
//Firebase
FIRDatabase.database().reference(withPath: "Icons").child("img\(indexPath.row)").child("imgLink").observeSingleEvent(of: .value, with: { (snapshot) in
if let snapString = snapshot.value as? String {
icon.sd_setShowActivityIndicatorView(true)
icon.sd_setIndicatorStyle(.gray)
icon.sd_setImage(with: URL(string: snapString))
}
}) { (error) in
print(error.localizedDescription)
}//firebase end
return cell
}
5秒という長いとは思われません。速度を上げたい場合は、イメージのサイズを小さくするか、遅延ロード(表示されているセルのみをロードする)のいずれかを行うことができます。 – milesper
これは時には時間がかかり、現時点では5つしかないようです。どのように私は怠惰な負荷を行うことができますか? @milesper –
怠惰な読み込みは、最初に表示されているセルを読み込んでいるだけで、5つしかない場合は役に立ちません。以下の答えが参考になるかもしれません。 – milesper