Skip to content

Commit 503185f

Browse files
committed
Store childCancellables inside ViewModelCancellable
1 parent e69ef98 commit 503185f

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

KMPObservableViewModelCore/ChildViewModels.swift

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,11 @@ import KMPObservableViewModelCoreObjC
99

1010
public extension ViewModel {
1111

12-
private func setChildViewModelPublishers(_ keyPath: AnyKeyPath, _ publishers: AnyHashable?) {
13-
if let publishers = publishers {
14-
observableViewModelPublishers(for: self).childPublishers[keyPath] = publishers
15-
} else {
16-
observableViewModelPublishers(for: self).childPublishers.removeValue(forKey: keyPath)
17-
}
18-
}
19-
2012
private func setChildViewModel<VM: ViewModel>(
2113
_ viewModel: VM?,
2214
at keyPath: AnyKeyPath
2315
) {
24-
setChildViewModelPublishers(keyPath, observableViewModelPublishers(for: viewModel))
16+
viewModelWillChange.cancellable.setChildCancellables(keyPath, ViewModelCancellable.get(for: viewModel))
2517
}
2618

2719
/// Stores a reference to the `ObservableObject` for the specified child `ViewModel`.
@@ -48,8 +40,8 @@ public extension ViewModel {
4840
_ viewModels: [VM?]?,
4941
at keyPath: AnyKeyPath
5042
) {
51-
setChildViewModelPublishers(keyPath, viewModels?.map { viewModel in
52-
observableViewModelPublishers(for: viewModel)
43+
viewModelWillChange.cancellable.setChildCancellables(keyPath, viewModels?.map { viewModel in
44+
ViewModelCancellable.get(for: viewModel)
5345
})
5446
}
5547

@@ -95,8 +87,8 @@ public extension ViewModel {
9587
_ viewModels: Set<VM?>?,
9688
at keyPath: AnyKeyPath
9789
) {
98-
setChildViewModelPublishers(keyPath, viewModels?.map { viewModel in
99-
observableViewModelPublishers(for: viewModel)
90+
viewModelWillChange.cancellable.setChildCancellables(keyPath, viewModels?.map { viewModel in
91+
ViewModelCancellable.get(for: viewModel)
10092
})
10193
}
10294

@@ -142,8 +134,8 @@ public extension ViewModel {
142134
_ viewModels: [Key : VM?]?,
143135
at keyPath: AnyKeyPath
144136
) {
145-
setChildViewModelPublishers(keyPath, viewModels?.mapValues { viewModel in
146-
observableViewModelPublishers(for: viewModel)
137+
viewModelWillChange.cancellable.setChildCancellables(keyPath, viewModels?.mapValues { viewModel in
138+
ViewModelCancellable.get(for: viewModel)
147139
})
148140
}
149141

KMPObservableViewModelCore/ViewModelCancellable.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ internal class ViewModelCancellable {
1212

1313
private var didInit = false
1414
private weak var cancellable: AnyCancellable?
15+
private var childCancellables: Dictionary<AnyKeyPath, AnyHashable>? = [:]
1516

1617
private func get(_ viewModel: any ViewModel) -> AnyCancellable {
1718
guard didInit else {
1819
let cancellable = AnyCancellable {
1920
if let cancellable = viewModel as? Cancellable {
2021
cancellable.cancel()
2122
}
23+
self.childCancellables = nil
2224
viewModel.clear()
2325
}
2426
self.cancellable = cancellable
@@ -31,7 +33,21 @@ internal class ViewModelCancellable {
3133
return cancellable
3234
}
3335

36+
func setChildCancellables(_ keyPath: AnyKeyPath, _ cancellables: AnyHashable?) {
37+
if let cancellables = cancellables {
38+
childCancellables?[keyPath] = cancellables
39+
} else {
40+
childCancellables?.removeValue(forKey: keyPath)
41+
}
42+
}
43+
3444
static func get(for viewModel: any ViewModel) -> AnyCancellable {
3545
viewModel.viewModelWillChange.cancellable.get(viewModel)
3646
}
47+
48+
static func get(for viewModel: (any ViewModel)?) -> AnyCancellable? {
49+
guard let viewModel else { return nil }
50+
let cancellable = get(for: viewModel)
51+
return cancellable
52+
}
3753
}

0 commit comments

Comments
 (0)