同样根据以上的Reqres API 来示范
首先一样根据Response 建立Model
User.swift
:
struct UserGetResponse: Decodable {
let page : Int
let perPage : Int
let total: Int
let totalPages : Int
let data : [User]
}
struct User : Decodable, Hashable {
let id : Int
let email : String
let firstName : String
let lastName : String
let avatar : String
}
接着在UserURLSession.swift
处理关於URLSession
的事件
func userGetRequest(page: Int, completionHandler: @escaping (UserGetResponse) -> Void) {
let url = URL(string: "https://reqres.in/api/users?page=\(page)")!
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) {
data, response, error in
if let data = data {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let response = try decoder.decode(UserGetResponse.self, from: data)
completionHandler(response)
}catch(let error) {
print(error.localizedDescription)
}
} else {
print("No Data")
}
}.resume()
}
之後在View 设计画面并使用
GETSampleView.swift
:
import SwiftUI
struct GETSampleView: View {
@State private var users: [User] = []
var body: some View {
NavigationView {
VStack {
Button {
UserURLSession.shared.userGetRequest(page: 1) { response in
DispatchQueue.main.async {
users = response.data
}
}
} label: {
Text("GET Request")
}
ScrollView {
LazyVStack {
ForEach(users, id: \.self) { user in
UserItemView(user: user)
}
}
}
.cornerRadius(8)
}
.navigationBarTitleDisplayMode(.inline)
.navigationTitle(Text("URLSession GET Sample"))
}
}
}
struct GETSampleView_Previews: PreviewProvider {
static var previews: some View {
GETSampleView()
}
}
这边所有URLSession 的范例一起放在Github: URLSessionSample 供大家参考
什麽是 Single Threaded Execution Pattern? 透过 lock,只会有...
本章主要学习如何透过演算法学习训练思考 Palindrome BigO(n) 检查是否reverse...
has_many 的设定 class_name 可以变更关联的类别名称,例如以下新增了paid_at...
如标题,这篇想教大家如何在phpMyAdmin里「手动」建立资料表 还有char和varchar的差...
或许有人会问「那我要开发 SPA 网站时,要如何跟 Grails 搭配呢?」。这个问题的答案很简单,...