iOS Combine (SwiftUI)
[iOS - swiftUI] Combine의 ObservableObject @Published, objectWillChange
jake-kim
2022. 9. 15. 22:29
목차) Combine - 목차 링크
@Published

- propertyWrapper 형태이며 내부적으로 didSet에서 이벤트 방출하는 역할
@propertyWrapper public struct Published<Value>
- 사용하는 쪽에서는 $ 기호를 이용하여 projectedValue에 접근
- propertyWrapper의 projectedValue 개념은 이 포스팅 글 참고
final class MyData {
@Published var number: Int
init(number: Int) {
self.number = number
}
}
let data = MyData(number: 20)
data.$number
.sink { print("change value? = \($0)") }
data.number = 10
data.number = 1
/*
change value? = 20
change value? = 10
change value? = 1
*/
ObservableObject
- 이 프로토콜을 준수하면, Observable 인스턴스라는 의미
- Observable 인스턴스: 이벤트를 방출할 수 있는 인스턴스
- 해당 인스턴스를 Subscriber가 구독하여 사용할 수 있다는 의미

- 이 프로토콜을 준수하는 클래스는 objectWillChnage 프로퍼티 사용이 가능
- 이 프로퍼티를 이용하여 내부에서 변경되었을때 willSet안에서 objectWillChnage.send()를 호출하여 알림
- 구독하는 쪽에서는 objectWillChnage.sink { } 로 이벤트를 받아서 사용

- 인스턴스의 내부 @Published 값이 변경될때 objectWillChange 이벤트가 동작
- number 변수가 @Published가 아님에도 불구하고, objectWillChange.send()를 willSet에서 호출하여 마치 @Published처럼 이벤트 방출이 가능
- 구독하는 쪽에서는 objectWillChange를 sink로 구독하여 사용
- 값 형태는 ObservableObjectPublisher.Output 형태인데, 이건 Void의 별칭
final class MyData: ObservableObject {
var number: Int {
willSet { self.objectWillChange.send() }
}
init(number: Int) {
self.number = number
}
}
var data = MyData(number: 20)
data.objectWillChange
.send()
data.objectWillChange
.sink { print("change value? = \($0)") }
data.number = 10
data.number = 1
/*
change value? = ()
change value? = ()
*/
* 참고
https://developer.apple.com/documentation/combine/published
https://developer.apple.com/documentation/combine/observableobject/objectwillchange-2oa5v
https://developer.apple.com/documentation/combine/observableobject