How to use @ObservedObject to manage state from external objects
SwiftUI/Advanced state 2019. 11. 19. 16:10반응형
Hacking with Swift 사이트의 강좌 번역본입니다.
How to use @ObservedObject to manage state from external objects
observed 객체를 사용할때 필요한 3가지 핵심사항이 있습니다: ObservableObject 프로토콜은 데이터를 저장할 수 있는 클래스에서 사용되며, @ObservedObject 프로퍼티 래퍼(wrapper)는 뷰 내부에서 observable 객체 인스턴스를 저장하기 위해 사용되고, @Published 프로퍼티 래퍼(wrapper)는 observed 객체 내부의 모든 프로퍼티에 추가해서 변경될때 뷰가 업데이트 됩니다.
예제에서 처럼, UserSettings 클래스는 ObservableObject를 준수합니다.
class UserSettings: ObservableObject {
@Published var score = 0
}
코드가 많지 않지만, SwiftUI가 우리 대신에 엄청나게 많은 일을 하고 있습니다! 여기에는 2가지 중요한 사항이 있습니다.
- ObservableObject를 준수하는 것은 해당 클래스의 인스턴스가 뷰 내부에서 사용될 수 있도록 하므로, 중요한 변경사항이 발생할때 뷰가 다시 로딩될 것입니다.
- @Published 프로퍼티 래퍼(wrapper)는 SwiftUI에게 score가 변경하면 뷰를 다시 로딩해야 하는 것을 알려줍니다.
다음과 같이 뷰의 내부에서 UserSettings 클래스를 사용할 수 있습니다.
struct ContentView: View {
@ObservedObject var settings = UserSettings()
var body: some View {
VStack {
Text("Your score is \(settings.score)")
Button(action: {
self.settings.score += 1
}) {
Text("Increase Score")
}
}
}
}
보다시피, ObservedObject 프로퍼티 래퍼(wrapper)를 setting과 함께 사용하는 것 외에는, 거의 모든것이 같아 보입니다.
중요한 차이점 하나는, setting 프로퍼티가 private로 선언되지 않았다는 것입니다. 이는 바인딩 객체가 하나의 뷰 이상에서 사용될수 있기 때문이므로, 공개적으로 공유하는 것이 일반적입니다.
반응형
'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 send state updates manually using objectWillChange (0) | 2019.11.19 |
What’s the difference between @ObservedObject, @State, and @EnvironmentObject? (0) | 2019.11.19 |