質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

750閲覧

テーブルビューでFirestoreの処理を待つためにセマフォを実行するとずっと何も動かなくなる

qyoeku

総合スコア25

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/08/09 10:46

編集2022/01/12 10:55

cellを返す処理をセルの中身が入ってから実行したいのですが、Firestoreから情報を取得する処理が完了しないのでできません。どうすればいいでしょうか?
なお、リアルタイムのチャットなので更新があるごとにセルの情報を更新する必要があります

swift

1 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 2 cells = [] 3 if num! == 0{ 4 return 0 5 } 6 a = DispatchSemaphore(value: 0) 7 for i in 0...num!-1 { 8 let cell = tableView.dequeueReusableCell(withIdentifier: "cell") 9 let name = cell?.viewWithTag(1) as! UILabel 10 let message = cell?.viewWithTag(2) as! UILabel 11 let kiki = cell?.viewWithTag(3) as! UILabel 12 let kinum = cell?.viewWithTag(4) as! UILabel 13 ref!.collection("chat").document("(i)").getDocument{document , err in 14 name.text = document?.data()!["name"] as! String 15 message.text = document?.data()!["message"] as! String 16 kinum.text = document?.data()!["kikitai"] as! String 17 if (document?.data()!["username"]as! String) == UserDefaults.standard.string(forKey: "chatroom"){ 18 cell?.backgroundColor = UIColor.yellow 19 kiki.text = "なるほど!" 20 21 }else{ 22 kiki.text = "聞きたい!" 23 } 24 self.cells.append(cell) 25 if i == self.num!-1{ 26 self.a!.signal() 27 } 28 29 } 30 31 } 32 33 return num! 34 } 35 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 36 a!.wait() 37 return cells[indexPath.row]! 38 } 39

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/08/09 10:56

で、しつもんはなんでしょうか
MasakiHori

2019/08/09 11:33

セマフォはそのように動作させるためにあるものです。それが正しい動作です。
qyoeku

2019/08/09 11:43 編集

セマフォを入れないとFirebaseの情報でセルが作られる前にfunc tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell が発動してindex out of rangeになってしまいます。Firebaseの処理を止めずにFirebaseの処理が終わるまでreturnを待たせるにはどうしたら
qyoeku

2019/08/09 11:43

いいのでしょうか?
qyoeku

2019/08/10 03:06

なぜ固まってしまうのでしょうか?
guest

回答1

0

cellを返す処理をセルの中身が入ってから実行したいのですが、Firestoreから情報を取得する処理が完了しないのでできません。どうすればいいでしょうか?

考え方としては、テーブルに表示する内容がサーバーから読み込み終わるまでは

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

は0を戻してください(このときクルクル回るインジケーターを自分で出したりする事もあります)。
(というか、メンバー変数として何かしらのモデルの配列を保持しておいて、その戻り値を戻すのが定石です)

テーブルビューに表示するデータが揃ったらtableView.reloadData()をコールしてください。
これで再度tableViewからfunc tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Intfunc tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCellといった関数が呼び出されますので、適切な内容が戻り値として戻るようにしてください。

※そもそもUITableViewの使い方が間違っているという話です。

投稿2019/08/19 01:39

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問