teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

9

タイトルの変更、試したこと追加

2020/03/09 09:08

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
@@ -1,1 +1,1 @@
1
- Firebaseから取得しfor文で回したデータを非同期処理後も順番通りしたい
1
+ 2回目以降のfor文をFirebaseの非同期処理が終わったしたい(並行処理をさせたくない)
body CHANGED
@@ -212,6 +212,11 @@
212
212
  解決方法が分かる方がいましたら、ご回答お願いします。
213
213
  また別の方法でやりたいことが実装できるのであれば、その方法を教えて頂きたいです。
214
214
 
215
+ `追記`
216
+ 調べていたらforEach文というのが出てきたので、それを試してみましたがダメでした。
217
+ [参考にしたサイト](https://teratail.com/questions/219325)
218
+
219
+
215
220
  ### 補足情報(FW/ツールのバージョン)
216
221
 
217
222
  xcode 11.3.1

8

タイトルの変更

2020/03/09 09:08

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
@@ -1,1 +1,1 @@
1
- Firebaseから取得するデータをfor文実行した順番で取したい
1
+ Firebaseから取得for文でしたデータを非同期処理後も順番実装したい
body CHANGED
File without changes

7

質問文の修正

2020/03/09 08:41

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
File without changes
body CHANGED
@@ -206,6 +206,8 @@
206
206
  クロージャについて調べていたら、`weak self`というのが出てきたのでコードを書いてみたのですが恐らく関係ありませんでした。
207
207
  Firebaseとの非同期通信まで終わった後に、次のfor文内の処理が動くようにすれば解決できると思うのですが、調べても出てきませんでした。(そもそもそんなやり方が無いのかもしれませんが)
208
208
 
209
+ また、Firebase登録されているレストランを一つだけにしてみたらfor文は一度しか動かないので、投稿したユーザーは一致しました。逆にFirebase登録されているレストランを増やすほど、投稿したユーザーとは関係ないユーザーがばらばらに表示されてしまいます。
210
+
209
211
  説明が分かりにくかったらすみません。
210
212
  解決方法が分かる方がいましたら、ご回答お願いします。
211
213
  また別の方法でやりたいことが実装できるのであれば、その方法を教えて頂きたいです。

6

質問文の修正

2020/03/09 06:33

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
File without changes
body CHANGED
@@ -204,8 +204,9 @@
204
204
  ### 試したこと
205
205
 
206
206
  クロージャについて調べていたら、`weak self`というのが出てきたのでコードを書いてみたのですが恐らく関係ありませんでした。
207
- Firebaseとの非同期通信終わってから次にfor文内の処理が動くようにすれば解決できると思うのですが、調べても出てきませんでした。(そもそもそんなやり方が無いのかもしれませんが)
207
+ Firebaseとの非同期通信まで終わった後、次のfor文内の処理が動くようにすれば解決できると思うのですが、調べても出てきませんでした。(そもそもそんなやり方が無いのかもしれませんが)
208
208
 
209
+ 説明が分かりにくかったらすみません。
209
210
  解決方法が分かる方がいましたら、ご回答お願いします。
210
211
  また別の方法でやりたいことが実装できるのであれば、その方法を教えて頂きたいです。
211
212
 

5

文字の変更

2020/03/09 06:24

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
File without changes
body CHANGED
@@ -16,6 +16,8 @@
16
16
 
17
17
  アプリビルド時のログを見ると、下記のコードで示している箇所まではfor文で実行した通りに処理が走っているのですが、Firebaseとの通信(非同期処理?)後のクロージャがfor文とは関係ない順番で処理が実行されているためレストランを投稿したユーザーと関係無いユーザーの値がレビュー画面に反映させてしまっているのだと考えています。
18
18
 
19
+ 下のシュミレータ画面とcloud firestoreの画像をみて頂ければ分かるかと思いますが、はっぱを投稿したユーザーは値が反映されているユーザーではありません。
20
+
19
21
  ### シュミレータ画面
20
22
  ![![シュミレータ画面](95891a7087dce1d7c87077c2794ab642.gif)](92c23850853098cd130d5651979eeb53.gif)
21
23
 

4

コードの修正

2020/03/09 06:19

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
File without changes
body CHANGED
@@ -91,11 +91,8 @@
91
91
  var storeName: [String] = []
92
92
  var storeReview: [String] = []
93
93
  var storeImage: [String] = []
94
- var postUserNameArray: [String] = []
95
- var postUserIconArray: [String] = []
96
94
  var count = 0
97
95
  var storeCount = 0
98
- var viewTapGesture: UITapGestureRecognizer!
99
96
 
100
97
  // MARK: - Helper Functions
101
98
  override func viewDidLoad() {
@@ -156,11 +153,9 @@
156
153
  guard let postUserName = userInfo!["userName"] as? String, let postUserIcon = userInfo!["userImage"] as? String else { return }
157
154
  print(postUserName)
158
155
  print(postUserIcon)
159
- self.postUserNameArray.append(postUserName)
160
- self.postUserIconArray.append(postUserIcon)
161
156
 
162
157
           // 取得したレストランの情報とユーザーの情報を、引数で渡してレビュー画面を作成
163
- self.configureViewController(storeName: self.storeName[self.storeCount], storeReview: self.storeReview[self.storeCount], storeImage: self.storeImage[self.storeCount], count: self.count, postUserName: self.postUserNameArray[self.storeCount], postUserIcon: self.postUserIconArray[self.storeCount])
158
+ self.configureViewController(storeName: self.storeName[self.storeCount], storeReview: self.storeReview[self.storeCount], storeImage: self.storeImage[self.storeCount], count: self.count, postUserName: postUserName, postUserIcon: postUserIcon)
164
159
  self.storeCount += 1
165
160
  }
166
161
  }

3

文字の修正

2020/03/09 06:17

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
File without changes
body CHANGED
@@ -1,12 +1,12 @@
1
1
  こんにちは。お世話になります。
2
2
 
3
- ### 前提・実現したいこと
3
+ ### 前提
4
4
 
5
5
  SwfitとCloud Firestoreを使って、ユーザーがお気に入りのレストランを登録し、それをGoogle Map上でシェアするアプリを開発しています。
6
6
  Map上のマーカーのウィンドウをタップすると画面遷移し、レストランのレビューを見ることができるようにしています。レビュー画面では投稿したユーザーが誰かも分かるようにしています。
7
7
 
8
8
  またCloud Firestoreにはルートコレクションが2つあります。
9
- Storesコレクションのドキュメントを全て取得し、それをfor文で回します。各ドキュメント内のuserIdの値を取得した後に、それと一致するUserコレクションのドキュメントを参照して、そのドキュメント内にあるuserNameとuserImageを取り出してレビュー画面に投稿したユーザー名とアイコンを反映しています。
9
+ Storesコレクションのドキュメントを全て取得し、それをfor文で回しています。各ドキュメント内のuserIdの値を取得した後に、それと一致するUserコレクションのドキュメントを参照して、そのドキュメント内にあるuserNameとuserImageを取り出してレビュー画面に投稿したユーザー名とアイコンを反映しています。
10
10
 
11
11
  ### 実現したいこと・起きている問題
12
12
 

2

初心者マーク

2020/03/09 06:13

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,5 @@
1
+ こんにちは。お世話になります。
2
+
1
3
  ### 前提・実現したいこと
2
4
 
3
5
  SwfitとCloud Firestoreを使って、ユーザーがお気に入りのレストランを登録し、それをGoogle Map上でシェアするアプリを開発しています。

1

質問文の修正

2020/03/09 06:12

投稿

Naoki_Pro
Naoki_Pro

スコア23

title CHANGED
File without changes
body CHANGED
@@ -4,21 +4,26 @@
4
4
  Map上のマーカーのウィンドウをタップすると画面遷移し、レストランのレビューを見ることができるようにしています。レビュー画面では投稿したユーザーが誰かも分かるようにしています。
5
5
 
6
6
  またCloud Firestoreにはルートコレクションが2つあります。
7
- Storesコレクションから全てのドキュメントを取得し、各ドキュメント内のuserIdと一致するものを、Usersコレクションのドキュメントからようとしています。
7
+ Storesコレクションのドキュメントを全て取得し、それをfor文で回します。各ドキュメント内のuserIdの値を取得した後に、それと一致するUserコレクションのドキュメントを参照して、そのドキュメント内にあるuserNameとuserImageをり出てレビュー画面に投稿したユーザー名アイコンを反映しています。
8
8
 
9
- ### 発生している問題
9
+ ### 実現たいこと・起きている問題
10
10
 
11
- ```
12
- for文で
13
- Storesコクションからレストランの情報を取得し、レビュー画面に表示することはできているのですが投稿したユーザーが一致せず関係ないユーザーが表示されてしまいす。
11
+ レビュー画面に値を反映することはできているのですが投稿したユーザーとは関係ないユーザーの値反映されてしまうのでそれを解決したす。
14
- ```
15
12
 
13
+ ### 考えられる原因
14
+
15
+ アプリビルド時のログを見ると、下記のコードで示している箇所まではfor文で実行した通りに処理が走っているのですが、Firebaseとの通信(非同期処理?)後のクロージャがfor文とは関係ない順番で処理が実行されているためレストランを投稿したユーザーと関係無いユーザーの値がレビュー画面に反映させてしまっているのだと考えています。
16
+
16
17
  ### シュミレータ画面
17
18
  ![![シュミレータ画面](95891a7087dce1d7c87077c2794ab642.gif)](92c23850853098cd130d5651979eeb53.gif)
18
19
 
19
20
  ### アプリビルド時のログ画面
20
21
  ![ログ画面](ac3b73fadde7ec4fada56e8a11e28d7b.png)
21
22
 
23
+ ### Cloud Firestoreの構造
24
+ ![Stores](45499f6a64f3f38bb7aba6a251289888.png)
25
+ ![Users](926f35d2d964ad482d49f59e05bf6cd5.png)
26
+
22
27
  ### 該当のソースコード
23
28
 
24
29
  `Firebaseと通信するモデルクラス↓`
@@ -199,8 +204,12 @@
199
204
 
200
205
  ### 試したこと
201
206
 
202
- ここ問題に対し試しとを記載してください
207
+ クロージャつい調べていら、`weak self`いうのが出てきたのでコード書いみたのですが恐ら関係ありませんでした
208
+ Firebaseとの非同期通信が終わってから次にfor文内の処理が動くようにすれば解決できると思うのですが、調べても出てきませんでした。(そもそもそんなやり方が無いのかもしれませんが)
203
209
 
204
- ### 補足情報(FW/ツールのバージョンなど)
210
+ 解決方法が分かる方がいましたら、ご回答お願いします。
211
+ また別の方法でやりたいことが実装できるのであれば、その方法を教えて頂きたいです。
205
212
 
206
- ここにより詳細な情報を記載してください。
213
+ ### 補足情報(FW/ツールのバージョン)
214
+
215
+ xcode 11.3.1