Day22 URLSession 02 - GET

GET:取资料

同样根据以上的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 供大家参考


<<:  Day38 ( 电子元件 ) 七段显示器显示距离

>>:  Day26 - 动态模型 part1 (LSTM)

DAY 2:Single Threaded Execution Pattern,门就只有一个大家好好排队啊~

什麽是 Single Threaded Execution Pattern? 透过 lock,只会有...

Coding Practice

本章主要学习如何透过演算法学习训练思考 Palindrome BigO(n) 检查是否reverse...

Rails has_many

has_many 的设定 class_name 可以变更关联的类别名称,例如以下新增了paid_at...

Day 15 : PHP - 如何在phpMyAdmin手动建立资料表?char和varchar又该如何选择?

如标题,这篇想教大家如何在phpMyAdmin里「手动」建立资料表 还有char和varchar的差...

Java 开发 WEB 的好平台 -- Grails -- (3) 建立一个 SPA 的 Grails 专案

或许有人会问「那我要开发 SPA 网站时,要如何跟 Grails 搭配呢?」。这个问题的答案很简单,...