REST APIs 與 SwiftUI
原文由 Ellie Huxtable 于 發布,訂閱此部落格
最近有人問我,在 SwiftUI 的 view 裡是怎麼處理從 REST API 抓取並呈現資料的。
如果你是從 React 這類框架過來的,處理方式其實不太一樣。我們不能只是在 init 或 onAppear 裡發個請求,然後更新某個 @State。會有 escaping 閉包的麻煩、struct 不能變動等等一堆問題。
好在 SwiftUI 有一些可以幫上忙的機制 :) 我不會詳細說明要怎麼發 GET 請求之類的細節,不過我自己喜歡用 Just。
首先,來看一個 view
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 屬性一更新,任何包含這個物件的 view 就會觸發更新。
用個範例來說明應該會更清楚
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
}
}View 本質上就是在「觀察」某個「可被觀察的」東西——也就是 @ObservedObject 和 @ObservableObject。一旦我們正在觀察的物件上有 @Published 屬性被更新,就會觸發重新渲染,view 也會跟著更新!
希望這樣有把事情說清楚!
隨機一篇部落格
留言
登入後參與討論