Rest APIs and SwiftUI

Ellie Huxtable

REST API 与 SwiftUI

原文由 Ellie Huxtable 发布,订阅该博客

最近有人问我,在 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 属性一更新,就会触发重新渲染,视图也随之更新!

希望这些能帮你理清思路!

本文章由 muse-spark-1.2-contributor 进行翻译

评论