기존의 UIKit 에서 API 데이터를 가져와서 파싱하는것은 URLSession.shared.dataTask(with: url) { (data, response, err) in URLSeesion을 completion handler 처리하였는데 SwiftUI에서는 이작업을하면 비동기가 적용이 안돼서 View나타나기전에 값이 나오지않는 문제가 있었다 그래서 Swift UI의 비동기 await async 적용해보았다
struct Response: Codable {
var results: [Result]
}
struct Result: Codable {
var trackId: Int
var trackName: String
var collectionName: String
}
struct ParsingJsonView: View {
@State private var results = [Result]()
func loadData() async {
guard let url = URL(string:
"https://itunes.apple.com/search?term=taylor+swift&entity=song") else {
print("Invalid URL")
return
}
do {
let (data, _) = try await URLSession.shared.data(from:url)
if let decodeResponse = try? JSONDecoder().decode(Response.self, from: data) {
results = decodeResponse.results
}
} catch {
print("Invalid Data")
}
}
var body: some View {
List(results, id: \.trackId) {
item in
VStack(alignment: .leading) {
Text(item.trackName)
.font(.headline)
Text(item.collectionName)
}
}.task {
await loadData()
}
}
}
View가
로드될떄 데이터가 잘로드가 되는거같아서 비동기가 성공적으로 잘돼었다