REST API 与 SwiftUI
原文由 Ellie Huxtable 于 发布,订阅该博客
最近有人问我,在 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 属性一更新,就会触发重新渲染,视图也随之更新!
希望这些能帮你理清思路!
随机一篇博客
评论
登录后参与讨论