回答編集履歴

1

改善案の提起

2020/10/21 12:07

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -85,3 +85,55 @@
85
85
 
86
86
 
87
87
  ほかにも、Observer パターンや Delegate パターンなども考えられるので、必要に応じて使い分けていただければと思います。
88
+
89
+
90
+
91
+ ##追記
92
+
93
+
94
+
95
+ ```Swift
96
+
97
+ // String型の空配列を用意する
98
+
99
+ var answers: [String] = []
100
+
101
+ // 途中の処理
102
+
103
+ for document in QuerySnapshot!.documents {
104
+
105
+ let sample: Dictionary = document.data()
106
+
107
+ // ここで一旦受け取り
108
+
109
+ let answer = sample["answer"] as! String
110
+
111
+ commentary = sample["commentary"] as! String
112
+
113
+ quiz = sample["quiz"] as! String
114
+
115
+
116
+
117
+ // いったん配列に入れる
118
+
119
+ answers.append(answer)
120
+
121
+ }
122
+
123
+
124
+
125
+ // 最後に配列をまとめてクロージャに渡す
126
+
127
+ DispatchQueue.main.async {
128
+
129
+ completion(answers)
130
+
131
+ }
132
+
133
+ ```
134
+
135
+
136
+
137
+ 非同期で実行されるべきクロージャを `for-in` 内で何度も呼び出していることが悪さの原因かもしれません(競合が起きている可能性があるため)。
138
+
139
+ たとえば、一度仮の配列に `answer` を入れ、`for-in` の外で一度に処理する、という感じで記述してみてはいかがでしょうか。