Abhishek Agarwal
08/05/2024, 3:31 PMFrançois
08/05/2024, 3:37 PMFrançois
08/05/2024, 3:38 PMRichard Woollcott
08/05/2024, 4:10 PMAbhishek Agarwal
08/05/2024, 4:34 PMFrançois
08/05/2024, 4:45 PMAbhishek Agarwal
08/06/2024, 8:27 PMFrançois
08/07/2024, 5:43 AM.thread
modifier, it’s a bit more tricky in this case.
you can look at the previous sample or my example using macro.
it’s means, instead of binding your view from the .task
modifier, you need to do it the old way, from the .onAppear
From the SKIE documentation .
.onAppear {
Task {
await viewModel.activate()
}
}
Abhishek Agarwal
08/07/2024, 5:47 AMFrançois
08/07/2024, 5:49 AMFrançois
08/07/2024, 5:53 AMAbhishek Agarwal
08/07/2024, 5:55 AM@MainActor
class IOSVM: ObservableObject {
let kmmVM = SharedViewModel()
@Published var state: ViewState = .ideal
func activate() async {
for await state in kmmVM.mayriLFlow {
switch onEnum(of: state) {
case .error(_):
self.state = .ideal
case .loading(_):
self.state = .ideal
case .success(let data):
self.state = .success(data.data as? MayriState)
}
}
}
func send(action: ViewAction) {
kmmVM.sendAction(action: action)
}
}
François
08/07/2024, 5:57 AMAbhishek Agarwal
08/07/2024, 5:58 AMFrançois
08/07/2024, 5:59 AMFrançois
08/07/2024, 6:01 AMViewModelStore
usage as your needsAbhishek Agarwal
08/07/2024, 6:06 AM@MainActor
class SharedViewModelStoreOwner<VM : ViewModel> : ObservableObject, ViewModelStoreOwner {
var viewModelStore: ViewModelStore = ViewModelStore()
private let key: String = String(describing: type(of: VM.self))
init(_ viewModel: VM = .init()) {
viewModelStore.put(key: key, viewModel: viewModel)
}
var instance: VM {
get {
return viewModelStore.get(key: key) as! VM
}
}
deinit {
viewModelStore.clear()
}
}
//Apprahc 2
enum ViewState {
case loading
case ideal
case success(MayuriState?)
}
@MainActor
class MayuriVM: SharedViewModelStoreOwner<SharedViewModel> {
@Published var state: ViewState = .ideal
func activate() async {
for await state in instance.mayuriFlow {
switch onEnum(of: state) {
case .error(_):
self.state = .ideal
case .loading(_):
self.state = .ideal
case .success(let data):
self.state = .success(data.data as? MayuriState)
}
}
}
func send(action: ViewAction) {
instance.sendAction(action: action)
}
}
François
08/07/2024, 6:09 AMFrançois
08/07/2024, 6:12 AMFrançois
08/07/2024, 6:14 AMfor await state in instance.mayuriFlow {
viewState = state
}
Then add the switch
directly in the SwiftUI ViewFrançois
08/07/2024, 6:15 AMMayuriVM
should be used as a bridgeAbhishek Agarwal
08/07/2024, 6:16 AMFrançois
08/07/2024, 6:16 AMAbhishek Agarwal
08/07/2024, 6:17 AMFrançois
08/07/2024, 6:18 AMviewmodel.activate()
, so no big changeAbhishek Agarwal
08/07/2024, 6:21 AMFrançois
08/07/2024, 6:25 AMFrançois
08/07/2024, 6:27 AMAbhishek Agarwal
08/07/2024, 6:28 AMAbhishek Agarwal
08/07/2024, 6:29 AMFrançois
08/07/2024, 6:29 AMFrançois
08/07/2024, 6:30 AMFrançois
08/07/2024, 6:31 AMAbhishek Agarwal
08/07/2024, 6:33 AMAbhishek Agarwal
08/07/2024, 6:35 AMFrançois
08/07/2024, 6:50 AMFrançois
08/07/2024, 11:00 AMFrançois
08/07/2024, 11:01 AMtask
modifierFrançois
08/07/2024, 11:08 AMAbhishek Agarwal
08/08/2024, 8:06 AMFrançois
08/08/2024, 8:06 AM