swiftuiの非同期処理についての質問です。
URLSessionで通信を行い取ってきたjsonデータをデコードする一連の処理が非同期で行われ、次の処理にこの結果を使用したいため、この非同期の結果を待って同期的に処理をしたいのですが良い方法が分かりません。
現在は非同期処理の後、3秒間スリープさせてから次の処理に移っています。これが良い方法でないことは分かるのですがこのような場合にどうすればいいのか教えていただけると幸いです。async awaitなども試してみたのです全く上手く行きませんでした。
以下のコードのfor文全体の非同期処理が完了するまで、それ以下の処理を開始するのを待ちたいです。現在はThread.sleep(forTimeInterval: 3)を挿入しています。
swiftui
1func ListCreate() -> (){ 2 DataList = [] 3 print("関数呼ばれる") 4 5 6 for i in 0..<urls.count{ 7 print("urlデータ取得開始,\(i)回目") 8 let url:URL = URL(string: urls[i])! 9 URLSession.shared.dataTask(with: url) { data, response, error in 10 if let jsonData = data { 11 print("urlデータ取得成功\(i)回目") 12 print(jsonData) 13 getJSON(jsonData,i) 14 } else{ 15 print("urlデータ取得失敗\(i)回目") 16 } 17 }.resume() 18 } 19 20 Thread.sleep(forTimeInterval: 3) 21 22 print("全データ取得終了") 23 //構造体のインスタンスにした全データを日付順に並び替え 24 DataList.sort(by:{$0.SortDate > $1.SortDate}) 25 for s in DataList{ 26 print("タイトル: \(s.Title),日付:\(s.Date),サイト名:\(s.SiteName),リンク:\(s.Link)") 27 } 28}
swiftui
1struct Matome: View { 2 var list: () = ListCreate() 3 4 var body: some View { 5 NavigationStack{ 6 List{ 7 ForEach(0..<DataList.count, id: \.self){ index in 8 NavigationLink(destination:OpenWeb(url:DataList[index].Link)){ 9 HStack{ 10 URLImageView(viewModel: .init(url:DataList[index].Image)) 11 .frame(width:60, height:45) 12 VStack{ 13 Text(DataList[index].Title).font(.subheadline).truncationMode(.tail) 14 HStack{ 15 Text(DataList[index].SiteName).font(.caption) 16 Text(DataList[index].Date).font(.caption) 17 } 18 19 } 20 } 21 }//navigationlink 22 }.frame(height:60)//foreach 23 24 }.navigationBarTitle("まとめ",displayMode: .inline).refreshable { 25 ListCreate() 26 } 27 } //navigationstack 28 29 } 30} 31 32
非同期処理を待つのが間違いです。非同期処理を開始したら読み込み中の状態にして、終了したら表示を更新しましょう。