【发布时间】:2025-12-16 14:05:01
【问题描述】:
对于我想要实现的小型应用程序,我想使用 SwiftUI 并坚持使用 MVVM。
但是模型中的异步任务让我很头疼。
我创建了一个非常简单的例子来解释它:
查看:
import SwiftUI
struct ContentView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
VStack {
Text("\(viewModel.model.numberToDisplay)")
Button(action: {self.viewModel.model.increase()}) {
Text("increase")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(viewModel: ViewModel())
}
}
}
视图模型:
import Foundation
import SwiftUI
class ViewModel: ObservableObject {
@Published var model = Model()
}
型号:
import Foundation
struct Model {
private(set) var numberToDisplay: Int = 0
mutating func increase() {
for _ in 0...2 {
self.numberToDisplay += 1
sleep(1)
}
}
}
有了这个,用户界面将在开始时显示“0”。点击“increase”会阻止 UI 3 秒(参见模型中的 for 循环),然后会显示“3”。
我想要的是一个非阻塞的 UI,并且显示 numberToDisplay 的所有更新(0 -> 1 -> 2 -> 3 而不是 0 -> 3)。
如果我尝试在模型中使用这样的 DispatchQueue:
DispatchQueue.global().async {
self.numberToDisplay += 1
}
它只是给了我一个“转义闭包捕获变异 'self' 参数”错误。
对模型使用类而不是结构允许我使用 DispatchQueue,但更糟糕的是,UI 根本没有更新。 (DispatchQueue 的使用在这里没有任何作用。)
那么在模型中使用 SwiftUI 与 MVVM 和异步函数的合适方法是什么?
最好的问候 只是亚历克斯
【问题讨论】:
-
不要使用 MVVM,使用 SwiftUI
标签: asynchronous mvvm swiftui