Skip to content

Commit 441bb98

Browse files
committed
Add support for Cancellable ViewModels
1 parent 1f4d750 commit 441bb98

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

KMMViewModelCore/ObservableViewModelPublisher.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ public final class ObservableViewModelPublisher: Publisher {
1313
public typealias Output = Void
1414
public typealias Failure = Never
1515

16-
internal weak var viewModelScope: ViewModelScope?
16+
internal weak var viewModel: (any KMMViewModel)?
1717

1818
private let publisher = ObservableObjectPublisher()
1919
private var objectWillChangeCancellable: AnyCancellable? = nil
2020

21-
internal init(_ viewModelScope: ViewModelScope, _ objectWillChange: ObservableObjectPublisher) {
22-
self.viewModelScope = viewModelScope
23-
viewModelScope.setSendObjectWillChange { [weak self] in
21+
internal init(_ viewModel: any KMMViewModel, _ objectWillChange: ObservableObjectPublisher) {
22+
self.viewModel = viewModel
23+
viewModel.viewModelScope.setSendObjectWillChange { [weak self] in
2424
self?.publisher.send()
2525
}
2626
objectWillChangeCancellable = objectWillChange.sink { [weak self] _ in
@@ -29,12 +29,16 @@ public final class ObservableViewModelPublisher: Publisher {
2929
}
3030

3131
public func receive<S>(subscriber: S) where S : Subscriber, Never == S.Failure, Void == S.Input {
32-
viewModelScope?.increaseSubscriptionCount()
32+
viewModel?.viewModelScope.increaseSubscriptionCount()
3333
publisher.receive(subscriber: ObservableViewModelSubscriber(self, subscriber))
3434
}
3535

3636
deinit {
37-
viewModelScope?.cancel()
37+
guard let viewModel else { return }
38+
if let cancellable = viewModel as? Cancellable {
39+
cancellable.cancel()
40+
}
41+
viewModel.viewModelScope.cancel()
3842
}
3943
}
4044

@@ -85,6 +89,6 @@ private class ObservableViewModelSubscription: Subscription {
8589
subscription.cancel()
8690
guard !cancelled else { return }
8791
cancelled = true
88-
publisher.viewModelScope?.decreaseSubscriptionCount()
92+
publisher.viewModel?.viewModelScope.decreaseSubscriptionCount()
8993
}
9094
}

KMMViewModelCore/ObservableViewModelPublishers.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal func observableViewModelPublishers<ViewModel: KMMViewModel>(
2626
fatalError("ObservableViewModel has been deallocated")
2727
}()
2828
} else {
29-
let publisher = ObservableViewModelPublisher(viewModel.viewModelScope, viewModel.objectWillChange)
29+
let publisher = ObservableViewModelPublisher(viewModel, viewModel.objectWillChange)
3030
publishers = ObservableViewModelPublishers(publisher)
3131
let object = WeakObservableViewModelPublishers(publishers)
3232
objc_setAssociatedObject(viewModel, &observableViewModelPublishersKey, object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

0 commit comments

Comments
 (0)