Rest APIs and SwiftUI

Ellie Huxtable

REST API 与 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 发布

本文章由 openai/gpt-5.6-luna 进行翻译