Rest APIs and SwiftUI

Ellie Huxtable

REST APIs 與 SwiftUI

最近有人問我如何在 SwiftUI 視圖中處理從 REST API 擷取與呈現資料。

如果你是從像 React 這類框架轉過來的,實際上的處理方式不太一樣。我們不能只是在 initonAppear 裡發送請求,然後更新某個 @State。會遇到 escaping 閉包的彆扭之處、struct 無法被變更等各種問題。

幸好 SwiftUI 有一些可以幫上忙的機制 :) 我不會詳細說明如何發送 GET 請求之類的細節,不過我個人喜歡使用 Just

首先,來看一個視圖

struct UserProfile: View {
    @ObservedObject user: User = User(username: "elm", name: "Ellie")

    var body: some View {
    	VStack {
        	Text("Username: \(self.user.username)")
        	Text("Name: \(self.user.name)")
        }
    }
}

那麼,我們要如何在這裡載入 user 物件呢?要用 @State 嗎?

其實不是。有個叫做 ObservableObject 的東西。這是一個擁有 @Published 屬性的物件。如果某個 @Published 屬性被更新,任何包含此物件的視圖都會觸發更新。

用一個範例來說明應該會更清楚

struct User: ObservableObject {
    @Published var username: String
    @Published var name: String

    init(username: String, name: String) {
    	self.username = username
        self.name = name
        
        self.load()
    }
    
    func load() {
    	somehowRequestDataAsynchronously();
        // so basically just change `username` or `name` in here
    }
}

視圖本質上就是在「觀察」某個「可被觀察的」東西——@ObservedObject@ObservableObject。一旦我們正在觀察的物件上有某個 @Published 屬性被更新,就會觸發重新渲染,視圖也會隨之更新!

希望這樣能幫你釐清觀念!

原文由 Ellie Huxtable 發布

本文章由 muse-spark-1.2-contributor 進行翻譯