Rest APIs and SwiftUI

Ellie Huxtable

REST APIs 與 SwiftUI

原文由 Ellie Huxtable 發布,訂閱此部落格

最近有人問我,在 SwiftUI 的 view 裡是怎麼處理從 REST API 抓取並呈現資料的。

如果你是從 React 這類框架過來的,處理方式其實不太一樣。我們不能只是在 initonAppear 裡發個請求,然後更新某個 @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 也會跟著更新!

希望這樣有把事情說清楚!

本文章由 muse-spark-1.2-contributor 進行翻譯

留言