@@ -9,36 +9,27 @@ import Combine
99import KMPObservableViewModelCoreObjC
1010
1111/// Publisher for `ObservableViewModel` that connects to the `ViewModelScope`.
12- public final class ObservableViewModelPublisher : Publisher {
12+ public final class ObservableViewModelPublisher : Combine . Publisher , KMPObservableViewModelCoreObjC . Publisher {
1313 public typealias Output = Void
1414 public typealias Failure = Never
1515
16- internal weak var viewModel : ( any ViewModel ) ?
16+ internal let cancellable = ViewModelCancellable ( )
1717
18- private let publisher = ObservableObjectPublisher ( )
19- private var objectWillChangeCancellable : AnyCancellable ? = nil
18+ private let publisher : ObservableObjectPublisher
19+ private let subscriptionCount : any SubscriptionCount
2020
21- internal init ( _ viewModel: any ViewModel , _ objectWillChange: ObservableObjectPublisher ) {
22- self . viewModel = viewModel
23- viewModel. viewModelScope. setSendObjectWillChange { [ weak self] in
24- self ? . publisher. send ( )
25- }
26- objectWillChangeCancellable = objectWillChange. sink { [ weak self] _ in
27- self ? . publisher. send ( )
28- }
21+ internal init ( _ viewModel: any ViewModel ) {
22+ self . publisher = viewModel. objectWillChange
23+ self . subscriptionCount = viewModel. viewModelScope. subscriptionCount
2924 }
3025
3126 public func receive< S> ( subscriber: S ) where S : Subscriber , Never == S . Failure , Void == S . Input {
32- viewModel ? . viewModelScope . increaseSubscriptionCount ( )
33- publisher. receive ( subscriber: ObservableViewModelSubscriber ( self , subscriber) )
27+ subscriptionCount . increase ( )
28+ publisher. receive ( subscriber: ObservableViewModelSubscriber ( subscriptionCount , subscriber) )
3429 }
3530
36- deinit {
37- guard let viewModel else { return }
38- if let cancellable = viewModel as? Cancellable {
39- cancellable. cancel ( )
40- }
41- viewModel. clear ( )
31+ public func send( ) {
32+ publisher. send ( )
4233 }
4334}
4435
@@ -47,16 +38,16 @@ private class ObservableViewModelSubscriber<S>: Subscriber where S : Subscriber,
4738 typealias Input = Void
4839 typealias Failure = Never
4940
50- private let publisher : ObservableViewModelPublisher
41+ private let subscriptionCount : any SubscriptionCount
5142 private let subscriber : S
5243
53- init ( _ publisher : ObservableViewModelPublisher , _ subscriber: S ) {
54- self . publisher = publisher
44+ init ( _ subscriptionCount : any SubscriptionCount , _ subscriber: S ) {
45+ self . subscriptionCount = subscriptionCount
5546 self . subscriber = subscriber
5647 }
5748
5849 func receive( subscription: Subscription ) {
59- subscriber. receive ( subscription: ObservableViewModelSubscription ( publisher , subscription) )
50+ subscriber. receive ( subscription: ObservableViewModelSubscription ( subscriptionCount , subscription) )
6051 }
6152
6253 func receive( _ input: Void ) -> Subscribers . Demand {
@@ -71,24 +62,21 @@ private class ObservableViewModelSubscriber<S>: Subscriber where S : Subscriber,
7162/// Subscription for `ObservableViewModelPublisher` that decreases the subscription count upon cancellation.
7263private class ObservableViewModelSubscription : Subscription {
7364
74- private let publisher : ObservableViewModelPublisher
65+ private var subscriptionCount : ( any SubscriptionCount ) ?
7566 private let subscription : Subscription
7667
77- init ( _ publisher : ObservableViewModelPublisher , _ subscription: Subscription ) {
78- self . publisher = publisher
68+ init ( _ subscriptionCount : any SubscriptionCount , _ subscription: Subscription ) {
69+ self . subscriptionCount = subscriptionCount
7970 self . subscription = subscription
8071 }
8172
8273 func request( _ demand: Subscribers . Demand ) {
8374 subscription. request ( demand)
8475 }
8576
86- private var cancelled = false
87-
8877 func cancel( ) {
8978 subscription. cancel ( )
90- guard !cancelled else { return }
91- cancelled = true
92- publisher. viewModel? . viewModelScope. decreaseSubscriptionCount ( )
79+ subscriptionCount? . decrease ( )
80+ subscriptionCount = nil
9381 }
9482}
0 commit comments