Skip to content

Instantly share code, notes, and snippets.

@takoikatakotako
Created May 3, 2024 16:46
Show Gist options
  • Save takoikatakotako/63ccc7aa781296d2b73c41cef81c246f to your computer and use it in GitHub Desktop.
Save takoikatakotako/63ccc7aa781296d2b73c41cef81c246f to your computer and use it in GitHub Desktop.
Swiftのasync,awaitを使ってAPIと画像を取得し、全てが揃ってから表示する
import SwiftUI
struct ContentView: View {
@State var pokemons: [Pokemon] = []
var body: some View {
VStack {
ForEach(pokemons) { pokemon in
HStack {
Image(uiImage: pokemon.image)
.resizable()
.frame(width: 100, height: 100)
VStack(alignment: .leading) {
Text("No: \(pokemon.id)")
Text(pokemon.name)
Text(pokemon.name)
}
Spacer()
}
Divider()
}
}
.task {
guard let pokemons = try? await fetchPokemons() else {
return
}
await MainActor.run {
self.pokemons = pokemons
}
}
}
private func fetchPokemons() async throws -> [Pokemon]{
let host = "https://swiswiswift.com/2022-06-16"
let url = URL(string: "\(host)/pokemons.json")!
let (data, _) = try await URLSession.shared.data(from: url)
let pokemonResponses = try JSONDecoder().decode([PokemonResponse].self, from: data)
var pokemons: [Pokemon] = []
for pokemonResponse in pokemonResponses {
let imageUrl = URL(string: "\(host)/\(pokemonResponse.imageName)")!
let (data, _) = try await URLSession.shared.data(from: imageUrl)
let image = UIImage(data: data)!
let pokemon = Pokemon(
id: pokemonResponse.id,
name: pokemonResponse.name,
imageName: pokemonResponse.name,
image: image)
pokemons.append(pokemon)
}
return pokemons
}
}
import SwiftUI
struct Pokemon: Identifiable {
let id: Int
let name: String
let imageName: String
let image: UIImage
}
struct PokemonResponse: Decodable {
let id: Int
let name: String
let imageName: String
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment