前提・実現したいこと
現在、xcode(swift)とfirestoreを用いて、DBに入っているフォロワー情報から、フォロワー一覧をtableviewに表示しようと試みています。
しかし同期処理やカスタムセルについて理解不足のためか上手くいきません。ご教授くださいませ。
発生している問題・エラーメッセージ
Thread 1: Fatal error: Index out of range
該当のソースコード
swift
1// セルを返す 2 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 3 let cell = tableView.dequeueReusableCell(withIdentifier: "SocialTableViewCell", for: indexPath) as! SocialTableViewCell 4 DispatchQueue.global().async { 5 self.fetchSocialTable() 6 DispatchQueue.main.async { 7 let data = self.socialTable[indexPath.row] 8 cell.UserName.text = data.UserName 9 cell.UserID.text = data.UserID 10 } 11 } 12 return cell 13 } 14 15 func fetchSocialTable(){ 16 self.db.collection("users").document(self.uid).collection("followers").limit(to:20).getDocuments(){snapshot,err in 17 if let snapshot = snapshot{ 18 self.socialTable = snapshot.documents.map{ userData -> SocialTable in 19 let data = userData.data() 20 return SocialTable(iconname: "hogehoge", UserName: data["UserName"] as! String, UserID: data["UserID"] as! String) 21 } 22 } 23 } 24 }
該当部分のソースコードを抜粋しましたが、
let data = self.socialTable[indexPath.row]
この部分で上記エラーが生じます。
printで確認したところ、socialTableには何も入っていませんでした。
socialTableは以下で初期化しています。
struct SocialTable{ var iconname: String var UserName: String var UserID: String } private var socialTable: [SocialTable] = []
fetchSocialTable関数内にあるself.uidにドキュメント名が正しく入っていることは確認済みです。
print関数で確認したところ、fetchSocialTable関数の通信処理が始まる前に該当のエラー箇所が実行されているようです。
同期処理は正しく書けていると思っているのですが、やはり間違っているのでしょうか。
ご教授いただきたいです。また、何か情報が足りなければお申し付けください。
追記
swift
1// セルを返す 2 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 3 let cell = tableView.dequeueReusableCell(withIdentifier: "SocialTableViewCell", for: indexPath) as! SocialTableViewCell 4 let queue = DispatchQueue.global(qos: .default) 5 let dataset = self.fetchSocialTable() 6 queue.async { 7 cell.UserName.text = dataset[indexPath.row].UserName 8 cell.UserID.text = dataset[indexPath.row].UserID 9 } 10 11 return cell 12 } 13 14func fetchSocialTable() -> [SocialTable]{ 15 let semaphore = DispatchSemaphore(value: 0) 16 var data:[SocialTable] = [] 17 self.db.collection("users").document(self.uid).collection("followers").limit(to:20).getDocuments(){snapshot,err in 18 if let snapshot = snapshot{ 19 print("connect firestore...") 20 for document in snapshot.documents { 21 data.append(SocialTable(iconname: "hogehoge", UserName: document.data()["Nm"] as! String, UserID: document.data()["UI"] as! String)) 22 } 23 } 24 semaphore.signal() 25 print("semaphore ok") 26 print(self.socialTable) 27 } 28 print("semaphore wait...") 29 semaphore.wait() 30 print("complete...") 31 return data 32 }
これで実行した場合、semaphore wait...のみが出力されその後の処理が走りません。
一旦テーブルへの書き込みをやめて、firestoreからデータを取得する部分の確認を行ったのですが、それは上手くいっていました。
何かいけない点があるのでしょうか。
回答2件
あなたの回答
tips
プレビュー