SwiftUI networking dengan URLSession

Ihwan
2 min readNov 19, 2020
Photo by Jordan Harrison on Unsplash

Dewasa ini, perkembangan teknologi pembuatan antar muka untuk platform apple (ios, iPadOs, MacOs) sudah semakin canggih. jika sebelumnya kita memakai UIKit / StoryBoard maka sekarang kita memiliki SwiftUI. SwiftUI memberikan kita kemudahan yang jauh lebih simple dari UI Builder sebelumnya, kita bisa membuat UI secara Programmatical / Deklaratif serta Drag & Drop.

Di kesempatan kali ini kita akan membuat sebuah aplikasi yang memuat daftar wisata yang berasal dari api milik Dicoding https://tourism-api.dicoding.dev/list

Seperti biasa mari buat project SwiftUI nya dan langsung saja kita buat kelas model nya seperti berikut:

struct PlacesResponse: Decodable {  let places: [Place]}

struct Place: Decodable {

let id: Int
let name: String
let description: String
let address: String
let longitude: Double
let latitude: Double
let like: Int
let image: String

}

then, kita jadikan ContentView nya sebagai berikut.

struct ContentView: View {
@State var places = [Place]()

var body: some View {
List(places, id: \.id){ item in
VStack(alignment: .leading){
Text(item.name)
}
}
}

selanjutnya kita beri modifier onAppear pada Widget / Component List

.onAppear(perform: {
URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://tourism-api.dicoding.dev/list")!)){ data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(PlacesResponse.self, from: data){
DispatchQueue.main.async{
self.places = decodedResponse.places
}
return
}

}
}.resume()

})
}

maka kode akhir nya seperti berikut:

import SwiftUI

struct ContentView: View {
@State var places = [Place]()

var body: some View {
List(places, id: \.id){ item in
VStack(alignment: .leading){
Text(item.name)
}
}.onAppear(perform: {
URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://tourism-api.dicoding.dev/list")!)){ data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(PlacesResponse.self, from: data){
DispatchQueue.main.async{
self.places = decodedResponse.places
}
return
}

}
}.resume()

})
}


}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

struct PlacesResponse: Decodable {

let places: [Place]

}

struct Place: Decodable {

let id: Int
let name: String
let description: String
let address: String
let longitude: Double
let latitude: Double
let like: Int
let image: String

}

silahkan di run dan lihat hasilnya :)

--

--