관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swiftUI] Combine의 ObservableObject @Published, objectWillChange 본문

iOS Combine (SwiftUI)

[iOS - swiftUI] Combine의 ObservableObject @Published, objectWillChange

jake-kim 2022. 9. 15. 22:29

목차) Combine - 목차 링크

@Published

https://developer.apple.com/documentation/combine/published

  • propertyWrapper 형태이며 내부적으로 didSet에서 이벤트 방출하는 역할
@propertyWrapper public struct Published<Value>
  • 사용하는 쪽에서는 $ 기호를 이용하여 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가 구독하여 사용할 수 있다는 의미

https://developer.apple.com/documentation/combine/observableobject

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

https://developer.apple.com/documentation/combine/observableobject/objectwillchange-2oa5v

  • 인스턴스의 내부 @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

Comments