REST APIs 與 SwiftUI
最近有人問我如何在 SwiftUI 視圖中處理從 REST API 擷取與呈現資料。
如果你是從像 React 這類框架轉過來的,實際上的處理方式不太一樣。我們不能只是在 init 或 onAppear 裡發送請求,然後更新某個 @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 屬性被更新,就會觸發重新渲染,視圖也會隨之更新!
希望這樣能幫你釐清觀念!
隨機一篇部落格