我想在我的SwiftUI应用程序中设置一个在两个或多个View模型之间共享的数据控制器.我了解了如何将数据控制器设置为单例,以便在两者之间共享该实例,但我也了解了单例是一种反模式.我有什么 Select ?
这是我当前的try ,但没有成功,因为我相信每个VM最终都会实例化自己的用户控制器实例.在一个视图中更新用户名不会在另一个视图中更新.
UserController
@Observable final class UserController {
private(set) var userProfile: UserProfile?
func getUserProfile() async -> () {
do {
...
} catch {
...
}
}
func updateUsername(newUsername: String) -> () {
userProfile?.updateUsername(newUsername: newUsername)
}
}
首页视图Model
@Observable final class 首页视图Model {
var controller: UserController
init(controller: UserController) {
self.controller = controller
}
func getData() async {
await controller.getUserProfile()
}
func updateUsername(newUsername: String) -> () {
controller.updateUsername(newUsername: newUsername)
}
}
设置视图模型
@Observable final class 设置视图模型 {
var controller: UserController
init(controller: UserController) {
self.controller = controller
}
func getData() async {
await controller.getUserProfile()
}
func updateUsername(newUsername: String) -> () {
controller.updateUsername(newUsername: newUsername)
}
}
在这些视图中,我通过try 更新用户名以使其反映在两个视图中来测试这一点.
首页视图
struct 首页视图: View {
@State private var vm = 首页视图Model(controller: UserController())
var body: some View {
VStack {
if let userProfile = vm.controller.userProfile {
Text("\(userProfile.username)")
}
Button("Get data") {
Task {
await vm.getData()
}
}
Button("Update username") {
vm.updateUsername(newUsername: "首页视图Username")
}
}
}
}
设置查看
struct 设置查看: View {
@State private var vm = 设置视图模型(controller: UserController())
var body: some View {
VStack {
if let userProfile = vm.controller.userProfile {
Text("\(userProfile.username)")
}
Button("Update username") {
vm.updateUsername(newUsername: "Settings username")
}
}
}
}
我使用此设置的目标是拥有一个数据控制器/文件,其中包含所需的所有API请求及其响应.当我为一个屏幕设置一个视图模型时,我可以用一种方式来设置它,它使用来自控制器的数据,该控制器在更新时同步整个应用程序.