Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Human interface guide
- uiscrollview
- Observable
- SWIFT
- UICollectionView
- swift documentation
- ios
- swiftUI
- ribs
- 리펙터링
- clean architecture
- Xcode
- collectionview
- 리팩토링
- tableView
- combine
- rxswift
- UITextView
- Clean Code
- 애니메이션
- 리펙토링
- uitableview
- Protocol
- 스위프트
- map
- MVVM
- RxCocoa
- Refactoring
- HIG
- 클린 코드
Archives
- Today
- Total
김종권의 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
- 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
'iOS Combine (SwiftUI)' 카테고리의 다른 글
[iOS - SwiftUI] Combine의 Publisher (AnyPublisher, Published) 사용 방법 (0) | 2022.09.17 |
---|---|
[iOS - SwiftUI] Combine의 Cancellable (AnyCancellable) 사용 방법 (2) | 2022.09.16 |
[iOS - SwiftUI] Combine 훑어보기 - RxSwift와의 차이점 (0) | 2022.09.14 |
[iOS - SwiftUI] Combine 이란? (2) | 2022.09.13 |
[iOS - swiftUI] Combine - 목차 (0) | 2022.09.12 |
Comments