REST API와 SwiftUI
원문은 Ellie Huxtable님이 에 게재했습니다. 이 블로그 구독하기
최근에 SwiftUI 뷰에서 REST API로부터 데이터를 가져와 렌더링하는 방법을 어떻게 처리하는지 질문을 받았다.
React 같은 걸 써오던 분이라면 처리 방식이 사실 좀 다르다는 걸 알 수 있을 것이다. 그냥 init이나 onAppear에서 요청을 쏘고 @State를 업데이트하는 식으로는 할 수 없다. escaping 클로저 문제나 struct가 mutable하지 않다는 점 등등 여러모로 어색한 부분이 생긴다.
다행히 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 프로퍼티가 업데이트되는 즉시 리렌더링이 트리거되고 뷰가 업데이트된다!
이걸로 좀 명확해졌기를 바란다!
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기