一样的模式再来一次,根据以上的Reqres API 来示范
首先一样根据Response 建立Model
User.swift
:
struct UserUpdateResponse: Decodable {
var name: String
var job: String
var updatedAt: Date?
var modifiedUpdateAt: String {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
if let newDate = updatedAt {
return dateFormatter.string(from: newDate)
} else {
return "******"
}
}
enum CodingKeys: String, CodingKey {
case name
case job
case updatedAt
}
}
接着在UserURLSession.swift
处理关於URLSession
的事件
func userUpdateRequest(userRequestBody:UserRequestBody,completionHandler: @escaping (UserUpdateResponse) -> Void) {
let url = URL(string: "https://reqres.in/api/users/2")!
// MARK: URLRequest
var request = URLRequest(url: url)
request.httpMethod = "PUT"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
//MARK: POST Request V.1.0
guard let httpBody = try? JSONEncoder().encode(userRequestBody) else {
print("Invalid httpBody")
return
}
// MARK: Set httpBody
request.httpBody = httpBody
URLSession.shared.dataTask(with: request) {
data, response, error in
if let data = data {
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(DateFormatter.customFormatter)
let user = try decoder.decode(UserUpdateResponse.self, from: data)
completionHandler(user)
}catch(let error) {
print(error.localizedDescription)
}
} else {
print("No Data")
}
}.resume()
}
}
之後在View 设计画面并使用
UPDATESampleView.swift
:
import SwiftUI
struct UPDATESampleView: View {
@State private var name = "Ryder"
@State private var job = "Engineer"
@State var user :UserUpdateResponse = UserUpdateResponse(name: "*****", job: "*****", updatedAt: nil)
var body: some View {
NavigationView {
VStack {
List(){
Text("UPDATE sample")
Section(header: Text("Request Data")) {
TextField("Name: ", text: $name)
TextField("Job: ", text: $job)
}
}
List() {
Section(header: Text("Response Data")) {
Text("Name: \(user.name)")
Text("Job: \(user.job)")
Text("Date updated: \(user.modifiedUpdateAt)")
}
}
.listStyle(GroupedListStyle())
Button {
UserURLSession.shared.userUpdateRequest(userRequestBody: UserRequestBody(name: name, job: job)) { newUser in
DispatchQueue.main.async {
user = newUser
}
}
} label: {
Text("UPDATE Request")
}
.padding()
.foregroundColor(Color.white)
.background(Color.green)
.cornerRadius(8)
}
.navigationBarTitleDisplayMode(.inline)
.navigationTitle(Text("URLSession UPDATE Sample"))
}
}
}
struct UPDATESampleView_Previews: PreviewProvider {
static var previews: some View {
UPDATESampleView()
}
}
这边所有URLSession 的范例一起放在Github: URLSessionSample 供大家参考
<<: Day23 Plugin 从零开始到上架 - ActivityAware 介绍
>>: Day 25. Zabbix 实际报警案例分享 - 帐号资料被异动
今天要来介绍一个Windwos内建工具叫做工作排程器(Task Scheduler),他可以预先计划...
1.JS是什麽? Java Script 是一种运行在客户端的脚本语言 (script就是脚本的意思...
无论您拥有 iMac、MacBook、Mac mini 还是 Mac Pro,电脑在使用一段时间後都...
前言 今天会继续探讨其他的 flask 的函式。如果说昨天的函式是用来给予使用者回应,那今天提到的函...
在开始之前 前言 其实本来是没想到要写这篇的,毕竟平常生活跟工作已经够忙碌QQ 由於目前主要研究的是...