Rest APIs and SwiftUI

Ellie Huxtable

REST APIと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」を使用して翻訳されました。

コメント