以下のコードように複数回apiを呼び出して全ての処理が終わった後にself.delegate.didRecieveData()
を呼びたいのですが、
タイトルのような実行時エラーが起きてしまいます。
どなたかこの解決方法をご教授いただけますでしょうか?
Swift
1 func fetchData(data: [配列]) { 2 3 let dispatchGroup = DispatchGroup() 4 5 for (index, data) in data.enumerated() { 6 dispatchGroup.enter() 7 8 let urlString = "実際のURL" 9 10 guard let url = URL(string: urlString) else { return } 11 12 URLSession.shared.dataTask(with: url) { (data, resp, err) in 13 if let err = err { 14 print("Failed to fetch data:", err) 15 return 16 } 17 18 guard let data = data else { return } 19 do { 20 let empty = try JSONDecoder().decode(Empty.self, from: data) 21 self.results[index] = empty.result 22 23 } catch let jsonErr { 24 print("Failed to decode json:", jsonErr) 25 } 26 dispatchGroup.leave() 27 }.resume() 28 29 } 30 31 dispatchGroup.notify(queue: .main) { 32 self.delegate.didRecieveData() 33 } 34 }
基本的にはそんな感じでいいはずですが、バックグラウンドスレッドで self.results を書き換えて大丈夫か (もしかして、self.results が書き換わったら何か処理をするようにしてませんか? results をローカル変数にして、dispatchGroup.notify でセットする方が安全でしょう。) とか、dataTask の completionHandler でエラーの場合に dispatchGroup.leave() してない (completionHandler の先頭で defer { dispatchGroup.leave() } しておくのがお勧めです。) のが気になります。
あなたの回答
tips
プレビュー