REST API 与 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 属性发生更新,就会触发重新渲染,视图也会随之更新!
希望这能把问题讲清楚!
随机一篇博客