2017-05-18 14 views
0

私の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 
    } 
+0

5秒という長いとは思われません。速度を上げたい場合は、イメージのサイズを小さくするか、遅延ロード(表示されているセルのみをロードする)のいずれかを行うことができます。 – milesper

+0

これは時には時間がかかり、現時点では5つしかないようです。どのように私は怠惰な負荷を行うことができますか? @milesper –

+0

怠惰な読み込みは、最初に表示されているセルを読み込んでいるだけで、5つしかない場合は役に立ちません。以下の答えが参考になるかもしれません。 – milesper

答えて

1

です:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    return collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) 
} 

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 
    FIRDatabase.database().reference(withPath: "Icons").child("img\(indexPath.row)").child("imgLink").observeSingleEvent(of: .value, with: { [weak collectionView] (snapshot) in 
     guard let collectionView = collectionView else { return } 
     let cell = collectionView.cellForItem(at: indexPath) 
     /* do whatever you need with cell */ 
    }) { (error) in 
     /* handle error */ 
    } 
} 
+0

それは少し早くロードされますが、セルがすべてロードされた後に、 'let icon = cell?.WindTag(3)という行のエラー「スレッド1:EXC_BREAKPOINT(コード== 1、サブコード= 0x10007cbb0) UIImageView' –

+0

@NolanRanolin画像ビューのコンセントを追加 –

+0

再利用可能なセルのアイテムのコンセントを作成できませんか? @VasiliiMuravev –

関連する問題