【swift】UICollectionView内のCellにfirebaseから取得したデータを反映させたい
解決したいこと
UICollectionView内のCellに、他関数にて取得したデータを表示させたい
swiftで自作アプリケーションを作成しています。
firebaseに登録したデータを取得して、UICollectionView内のCellにそのデータを反映させたいです。
どうも、「cellForItemAt」が「firebaseからデータ取得する関数」より早く作動してしまい、うまく取得したデータをCellに表示できないようです。
解決方法をご教示願います。
発生している問題・エラー
Thread 1: Fatal error: Index out of range
該当するソースコード
import UIKit
import Firebase
class Home_Home_2_ViewController: UIViewController,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
@IBOutlet var collectionView: UICollectionView!
var dataSet: [[String]] = []
var myindustry: String! = ""
override func viewDidLoad() {
super.viewDidLoad()
getrecommend()
collectionView.delegate = self
collectionView.dataSource = self
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
collectionView.collectionViewLayout = layout
}
func getrecommend() {
let userID = Auth.auth().currentUser!.uid
let docRef = Firestore.firestore().collection("users").document(userID).addSnapshotListener { (snapShot, error) in
self.dataSet = []
if error != nil {
return
}
self.myindustry = (snapShot?.get("industry") as! String)
print(self.myindustry!)
let query = Firestore.firestore().collection("talkerPost").whereField("industry1", isEqualTo: self.myindustry!).getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
//ここにtableViewにどんどん値入れていく処理入れる
let data = document.data()
let title:String = data["talkTitle"] as! String
//let name = data[""]
let price:String = data["price"] as! String + "円"
self.dataSet.append([title,price])
//print(name!)
print(self.dataSet)
print(self.dataSet[0][0])
self.collectionView.reloadData()
}
}
}
}
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 3
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "recommendationCell", for: indexPath)
let reccomendtitleLabel = cell.viewWithTag(2) as! UITextView
reccomendtitleLabel.text = dataSet[indexPath.row][0]
let recommendpriceLabel = cell.viewWithTag(3) as! UILabel
recommendpriceLabel.text = dataSet[indexPath.row][1]
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width: CGFloat = UIScreen.main.bounds.width/3
let height = width
return CGSize(width: width, height: height)
}
}
問題箇所
reccomendtitleLabel.text = dataSet[indexPath.row][0]
0