Skip to content

Commit 014daa1

Browse files
committed
GH-17 fix issue with simultaneous accesses to viewModel property
1 parent c5bb613 commit 014daa1

File tree

3 files changed

+6
-14
lines changed

3 files changed

+6
-14
lines changed

KMMViewModelCore/KMMViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Combine
99
import KMMViewModelCoreObjC
1010

1111
/// A Kotlin Multiplatform Mobile ViewModel.
12-
public protocol KMMViewModel: ObservableObject where ObjectWillChangePublisher == ObservableObjectPublisher {
12+
public protocol KMMViewModel: AnyObject, ObservableObject where ObjectWillChangePublisher == ObservableObjectPublisher {
1313
/// The `ViewModelScope` of this `KMMViewModel`.
1414
var viewModelScope: ViewModelScope { get }
1515
}

KMMViewModelCore/ObservableViewModel.swift

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,11 @@ public final class ObservableViewModel<ViewModel: KMMViewModel>: ObservableObjec
2121

2222
public let objectWillChange: ObservableViewModelPublisher
2323

24-
private var _viewModel: ViewModel
25-
public var viewModel: ViewModel { _viewModel }
24+
public let viewModel: ViewModel
2625

2726
internal init(_ viewModel: ViewModel) {
2827
objectWillChange = ObservableViewModelPublisher(viewModel.viewModelScope, viewModel.objectWillChange)
29-
self._viewModel = viewModel
30-
}
31-
32-
public func get<T>(_ keyPath: KeyPath<ViewModel, T>) -> T {
33-
_viewModel[keyPath: keyPath]
34-
}
35-
36-
public func set<T>(_ keyPath: WritableKeyPath<ViewModel, T>, to newValue: T) {
37-
_viewModel[keyPath: keyPath] = newValue
28+
self.viewModel = viewModel
3829
}
3930
}
4031

KMMViewModelSwiftUI/ObservableViewModelProjection.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ public extension ObservableViewModel {
2222

2323
public subscript<T>(dynamicMember keyPath: WritableKeyPath<ViewModel, T>) -> Binding<T> {
2424
Binding {
25-
observableObject.get(keyPath)
25+
observableObject.viewModel[keyPath: keyPath]
2626
} set: { value in
27-
observableObject.set(keyPath, to: value)
27+
var viewModel = observableObject.viewModel
28+
viewModel[keyPath: keyPath] = value
2829
}
2930
}
3031
}

0 commit comments

Comments
 (0)