適当に作った参考例貼っておきますね^^
struct TestView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack{
TextField("入力してください。", text: $viewModel.viewText)
Button {
viewModel.viewModelFunc()
} label: {
Text("判定:"+viewModel.result)
}
}
}
}
class ViewModel: ObservableObject {
private var model = Model()
@Published var result = ""
@Published var viewText = ""
func viewModelFunc() {
model.modelFunc(thisValue: viewText) { [weak self] error in
self?.result = error
} success: { [weak self] success in
self?.result = success
}
}
}
class Model {
func modelFunc(thisValue: String, failure: @escaping (String) -> Void, success: @escaping (String) -> Void) {
if thisValue.isEmpty {
return DispatchQueue.main.async {
failure("error")
}
} else {
return DispatchQueue.main.async {
success("success")
}
}
}
}
これでthisValueをどのスレッドで取得しても返すのはメインスレッドになるかと思います。
また以上のものだとviewModelがmodelに依存しているので必要に応じて疎結合(DI)の処理をすると良いかと^^