Open onmyway133 opened 2 years ago
We can normally listen to sub ObservableObject by either listen to its objectWillChange or its Publisher
ObservableObject
objectWillChange
class SubModel: ObservableObject { @Published var count = 0 } class AppModel: ObservableObject { @Published var submodel: SubModel = SubModel() private var bag = Set<AnyCancellable>() init() { submodel.$count .sink(receiveValue: { [weak self] _ in self?.objectWillChange.send() }) } }
We can then make a convenient extension to ease this. We use DispatchQueue to trigger objectWillChange in another run loop, to achieve didSet behavior
DispatchQueue
didSet
import SwiftUI import Combine extension ObservableObject where ObjectWillChangePublisher == ObservableObjectPublisher { func dependsOn<T>(publisher: Published<T>.Publisher) -> AnyCancellable { publisher .sink(receiveCompletion: { _ in }, receiveValue: { [weak self] _ in DispatchQueue.main.async { self?.objectWillChange.send() } }) } } class AppModel: ObservableObject { @Published var submodel: SubModel = SubModel() private var bag = Set<AnyCancellable>() init() { dependsOn(publisher: submodel.$count) .store(in: &bag) } }
We can normally listen to sub
ObservableObject
by either listen to itsobjectWillChange
or its PublisherWe can then make a convenient extension to ease this. We use
DispatchQueue
to triggerobjectWillChange
in another run loop, to achievedidSet
behavior