SwiftUI
์ด ๊ธ์ alamofire์ ๊ฐ์ ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์์ฃผ ๊ธฐ์ด์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค!
json data๋ฅผ ๊ฐ์ ธ์ฌ ์ํ๋งํฌ: https://jsonplaceholder.typicode.com/todos
์ ์ฌ์ดํธ์์ ๋ฐ์ json์ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Todo๊ฐ Codable, Identifiable ํ๋กํ ์ฝ์ ์ฑํํด์ผ ํ๋ค. ๊ทธ ์ด์ ๋ ๊ฐ๊ฐ
Codable : JSONDecoder()์์ ์ฌ์ฉํ๊ธฐ ์ํจ
Identifiable : ๋ฐ์ดํฐ๋ฅผ List์์ ๋ฆฌ์คํ ํ ๋ ์ฌ์ฉํ๊ธฐ ์ํจ
struct Todo: Codable, Identifiable {
var userId: Int
var id: Int
var title: String
var completed: Bool
}
network.swift
class network {
func getTodos(completion: @escaping ([Todo]) -> Void) {
guard let url = URL(string: "https://jsonplaceholder.typicode.com/todos") else {
return
}
URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
guard let realData = data else {
return
}
do {
let todos = try JSONDecoder().decode([Todo].self, from: realData)
completion(todos)
}catch {
print(error)
return
}
}).resume()
}
}
์์๋๋ก ์ดํดํด๋ณด์. getTodos์ ์ต์ข ๊ธฐ๋ฅ์ ํจ์์ด๋ฆ๋๋ก json์ ๋ชจ๋ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค. (json ์ฃผ์ ์ด๋ฆ์ด todos)
do-catch๋ฌธ์์ todos: [Todo] ์ผ๊ฒ์ด๋ค. (json์ ๋ชจ๋ ๊ฐ์ ธ์์ [Todo]๋ก ์ ์ฅ) ํด๋ก์ ์ todos๋ฅผ ๋ณด๋ธ๋ค.
ContentView.swift
@State var todos = [Todo]()
var body: some View {
List(todos){ todo in
VStack(alignment: .leading) {
Text("ID: \(todo.id.description)")
.foregroundColor(.blue)
.bold()
Text(todo.title)
}.padding()
}
.onAppear{
network().getTodos { todos in
self.todos = todos
}
}
}
ContentView์ todos์๋ network.swift์ getTodos์์ ์์ฑ๋ todos๊ฐ ์ ์ฅ๋๋ค.
์์ ์ฌ์ฉ๋ ๊ธฐ๋ฅ๋ค ์ค์ ๋ชจ๋ฅด๋๊ฒ ์๋ค๋ฉด ์๋๋ฅผ ์ฐธ๊ณ ํ์๊ณ ๊ณต๋ถํ์ค ๋ ๊ผญ ๊ตฌ๊ธ๋งํ์ธ์ !
@escaping : ์์ฃผ ์ฝ๊ฒ ์๊ฐํด์ ํด๋ก์ ๋ฅผ getTodos ํจ์๋ด์์ ์ธ ์ ์๊ฒ ํด์ค๋ค๊ณ ์๊ฐํ์ (์๋๋ ๋ชป์)
guard : ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ์ต์ ๋์ด nil์ด๋ฉด ํจ์๋ฅผ ๋์ด์ ์คํํ์ง ์๊ณ ๋๋ธ๋ค. nil ์๋๋ฉด ์ต์ ๋ ๋ฒ๊ฒจ์ ์์๋ณ์(let)์ ์ ์ฅํ๊ณ ํจ์ ์๋์์ ์ง์ญ๋ณ์๋ก ์ฌ์ฉ๊ฐ๋ฅ
.onAppear : view๊ฐ ๋ํ๋ ๋ ์คํ๋ ๋ถ๋ถ์ ์ฌ๊ธฐ์ ์์ฑํ๋ฉด ๋๋ค
๊ฒฐ๊ณผ
์ฝ๋ ์ ์ฒด๋ณด๊ธฐ
https://github.com/sladuf/SwiftUI_practice/tree/main/practice_JSON
json์์ ์ํ๋ ๋ถ๋ถ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ struct ๋ง๋ค๊ธฐ
'๐ฑ iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๋ฐ์ด์ค ํ๋ฉด๊ณ ์ portrait only (0) | 2022.07.25 |
---|---|
[SwiftUI] Grid์์ฑ (0) | 2022.07.05 |
URLSession์ ํตํดJSON ๊ฐ์ ธ์ค๊ธฐ (2) (0) | 2022.07.04 |
Auto Layout 1 [Why?] (0) | 2022.05.31 |
[SwiftUI] ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ (1/5) @State (0) | 2021.10.11 |