How to send state updates manually using objectWillChange
SwiftUI/Advanced state 2019. 11. 19. 16:36
Hacking with Swift 사이트의 강좌 번역본입니다.
How to send state updates manually using objectWillChange
비록 컨트롤 상태(state)를 업데이트 하기 위해 @Published를 사용하는 것이 가장 쉬운 방법지만, 특별히 필요한 경우에 직접 처리 할 수 있습니다. 예를들어, 주어진 값을 만족하는 경우에만 뷰를 업데이트 할지도 모릅니다.
이러한 접근법은 3 단계로 사용합니다: Combine 프레임워크를 포함(importing)하고, publisher를 추가하고, publisher를 사용합니다. Publishers는 Combine이 SwiftUI가 1개 이상의 뷰에서 관찰하고 있는 모든 변경사항을 알려주는 방법입니다.
다음은 예제 코드 입니다.
import Combine
import SwiftUI
class UserAuthentication: ObservableObject {
let objectWillChange = ObservableObjectPublisher()
var username = "" {
willSet {
objectWillChange.send()
}
}
}
코드를 이해가기 쉽도록 세분화 합시다. 우선 다음에 오는 것을 가지고 있습니다.
let objectWillChange = ObservableObjectPublisher()
ObservableObjectPubliser의 인스턴스로 objectWillChange 프로퍼티를 만듭니다. 이것은 Combine 프레임워크에서 가져온 것이며, 코드를 컴파일 하기 위해서 import Combine을 추가해야 합니다. observable 객체 publisher가 하는 일은 간단합니다: 우리 객체가 변경되었다는 것을 알리고자 할때마다, 이를 publisher에게 요청합니다.
두번째, UserAuthentication의 username 프로퍼티에 willSet 프로퍼티 observer가 붙여있으므로 값이 변경될때마다 코드를 실행할 수 있습니다. 예제 코드에서, username이 변경될때마다 objectWillChange.send()를 호출하며, objectWillChangepublisher가 데이터가 변경되었다는 소식을 알려주므로, 구독했던 뷰들은 갱신할 수 있습니다.
UserAuthentication 클래스는 ObservableObject를 준수하며, @ObservedObject 프로퍼티 처럼 사용할 수 있습니다. 따라서 다음과 같이 사용자가 입력할때 입력한 것을 표시하는데 사용할 수도 있습니다.
struct ContentView: View {
@ObservedObject var settings = UserAuthentication()
var body: some View {
VStack {
TextField("Username", text: $settings.username)
.textFieldStyle(RoundedBorderTextFieldStyle())
Text("Your username is: \(settings.username)")
}
}
}
'SwiftUI > Advanced state' 카테고리의 다른 글
How to use a timer with SwiftUI (0) | 2019.11.20 |
---|---|
How to create custom bindings (0) | 2019.11.20 |
How to create constant bindings (0) | 2019.11.19 |
How to use @EnvironmentObject to share data between views (0) | 2019.11.19 |
How to use @ObservedObject to manage state from external objects (0) | 2019.11.19 |
What’s the difference between @ObservedObject, @State, and @EnvironmentObject? (0) | 2019.11.19 |