안녕하세요 코찐입니다.
아래의 자료를 따라서 공부하고 있습니다.
https://www.raywenderlich.com/books/combine-asynchronous-programming-with-swift/v2.0
KVO
그 유명한 KVO 입니다.
OperationQueue의 operation 개수가 변경되면 sink에서 이벤트를 받아볼 수 있습니다.
let queue = OperationQueue()
let subscription = queue.publisher(for: \.operationCount)
.sink {
print("Outstanding operations in queue: \($0)")
}
커스텀으로 만들려면?
1. NSObject 상속
2. @objc dynamic 키워드
KVO가 Objc를 통해 지원되기 때문에 NSObject와 @objc dynamic 를 통해서 사용 가능합니다.
class TestObject: NSObject {
@objc dynamic var integerProperty: Int = 0
}
let obj = TestObject()
let subscription = obj.publisher(for: \.integerProperty)
.sink {
print("integerProperty changes to \($0)")
}
obj.integerProperty = 100
obj.integerProperty = 200
integerProperty changes to 0
integerProperty changes to 100
integerProperty changes to 200
Observation Options
구독할 때 옵션을 줄 수 있습니다.
developer.apple.com/documentation/foundation/nskeyvalueobservingoptions
1. .inital : 초기 값을 방출.
2. .prior : 변화가 발생했을 때 이전 값과 새로운 값을 방출.
앞의 예제에서 options: [] 로 추가하면 초기값 안받습니다.
KVO가 @objc 키워드가 붙어서 optional이 안되는데, 초기값을 받기 싫은 경우에 이렇게 사용하면 됩니다.
유용하게 쓸 수 있을 것 같습니다.
let subscription = obj.publisher(for: \.integerProperty, options: [])
integerProperty changes to 100
integerProperty changes to 200
.prior는 이전값과 새로운값을 방출하는데
이걸 도대체 언제 쓸지는 의문입니다...
let subscription = obj.publisher(for: \.integerProperty, options: [.prior])
integerProperty changes to 0
integerProperty changes to 100
integerProperty changes to 100
integerProperty changes to 200
ObservableObject
이거는 SwiftUI 예제에서 접했었던 것인데, @Published 가 걸려있는 프로퍼티가 변경되는것을 감지할 수 있습니다.
어떤 프로퍼티가 변경되었는지는 구분 못합니다.
SwiftUI 처럼 ViewModel이 변경되면 View를 갱신해야할 때 사용할 수 있을 것 같습니다.
class MonitorObject: ObservableObject {
@Published var someProperty = false
@Published var someOtherProperty = ""
}
let object = MonitorObject()
let subscription = object.objectWillChange.sink {
print("object will change")
}
object.someProperty = true
object.someOtherProperty = "Hello world"
object will change
object will change
'iOS > Combine' 카테고리의 다른 글
[Combine] Chapter 16: Error Handling (0) | 2021.02.01 |
---|---|
[Combine 책 정리] Chapter 13: Resource Management (0) | 2021.01.27 |
[Combine 책 정리] Chapter 11: Timers (0) | 2021.01.27 |
[Combine 책 정리] Chapter 10: Debugging (0) | 2021.01.27 |
[Combine 책 정리] Chapter 9: Networking (0) | 2021.01.27 |