gpt4 book ai didi

networking - 如何使用Combine框架和SwiftUI发布网络请求的数据

转载 作者:行者123 更新时间:2023-12-01 04:26:05 24 4
gpt4 key购买 nike

我正在使用 swiftUI 和 Combine 框架以及 MVVM 开发一个 iOS 应用程序。
我想在一个名为 LoginService 的单独类中处理登录 API 请求,该类在 LoginViewModel 中使用。
现在我想知道我应该如何发布和观察view和ViewModel之间的属性。
我的意思是 ViewModel 是一个 ObservableObject 并且正在 View 中被观察,但是由于我在服务类中处理网络请求,LoginService 应该如何通知 LoginViewModel 和 LoginView 接收到数据并且应该更新 View ?

import Foundation
import Combine

class LoginViewModel: ObservableObject {

@Published var user = UserModel()

@Published var LoginStatus: Bool = false

@Published var LoginMessage: String = ""

var service = LoginService()

func Login(With email: String, And password: String) -> Bool {
service.validateLogin(email: email, password: password)
return false
}
}


这是 LoginViewModel 的代码。
当从服务器接收到数据以通知 View 时,LoginService 应该如何更改 LoginStatus、LoginMessage 和 user 的值?
我这么说是因为据我所知,您只能在 View(SwiftUI) 中观察 ObservableObjects。

最佳答案

好的,所以我以你的例子为例,我会做以下事情:

我假设您的服务返回 truefalse

import Foundation
import Combine

class LoginViewModel: ObservableObject {

@Published var LoginStatus: Bool = false

@Published var LoginMessage: String = ""

var service = LoginService()

func Login(_ email: String, _ password: String) -> Bool {
self.LoginStatus = service.validateLogin(email: email, password: password)
return self.LoginStatus
}
}


在您看来:

import SwiftUI

struct ContentView : View {

@ObservedObject var model = LoginViewModel()

var body: some View {
VStack {
Button(action: {
_ = self.model.Login("TestUser", "TestPassword")
}, label: {
Text("Login")
})
Text(self.model.LoginStatus ? "Logged In" : "Not Logged in")
}
}
}


它应该是关于那个的。

我删除了 UserModel因为你不应该嵌套模型。

我希望这有帮助。

编辑 1:

要自动验证某些内容,您可以使用 onApear()在你的视野中
或者用 olnrecieve() 听变化更新 UI 或状态
import SwiftUI

struct ContentView : View {

@ObservedObject var model = LoginViewModel()

var body: some View {
VStack {
Button(action: {
_ = self.model.Login("TestUser", "TestPassword")
}, label: {
Text("Login")
})
Text(self.model.LoginStatus ? "Logged In" : "Not Logged in")
}.onAppear {
// call a function that gets something from your server
// and modifies your state
self.model.validate()
}.onReceive(self.model.$LoginMessage, perform: { message in
// here you can update your state or your ui
// according the LoginMessage... this gets called
// whenever LoginMessage changes in your model
})
}
}

关于networking - 如何使用Combine框架和SwiftUI发布网络请求的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58625016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com