Swift中两类间信息共享及AuthViewModel与NetworkManager交互问题
解决方案
问题1:在NetworkManager中获取AuthViewModel的email和password
NetworkManager作为独立的网络工具类,不应直接依赖AuthViewModel,正确做法是通过方法参数传递所需数据,避免耦合:
- 先定义包含
email和password的请求结构体(符合Encodable):
struct LoginRequest: Encodable { let email: String let password: String }
- 在AuthViewModel中构造请求体,调用NetworkManager方法时传入:
@MainActor class AuthViewModel: ObservableObject { // ... 已有属性 ... func signIn() async { isSigningIn = true hasError = false let loginRequest = LoginRequest(email: email, password: password) do { let authResponse: AuthResponse = try await networkManager.makeAPIRequest( with: "your_login_api_url", objectToSend: loginRequest, method: .post, objectType: AuthResponse.self ) authToken = authResponse.token currentUser = authResponse.user } catch { hasError = true } isSigningIn = false } }
- 建议将NetworkManager的方法改为异步/await形式(替代completion回调),适配Swift并发规范:
final class NetworkManager { static let shared = NetworkManager() private init() {} func makeAPIRequest<T: Decodable>( with url: String, objectToSend: Encodable, method: APIMethod, objectType: T.Type ) async throws -> T { // 实现异步网络请求逻辑,抛出错误替代Result回调 } }
问题2:在AuthViewModel的init中正确调用NetworkManager的方法
你当前的init写法框架可行,只需完善fetchUser方法的实现,确保处理异步请求结果:
@MainActor class AuthViewModel: ObservableObject { // ... 已有属性 ... private let networkManager = NetworkManager.shared init() { Task { await fetchUser() } } private func fetchUser() async { hasError = false do { // 假设获取用户信息无需传参,定义空请求体 let user: User = try await networkManager.makeAPIRequest( with: "your_user_info_api_url", objectToSend: EmptyRequest(), method: .get, objectType: User.self ) currentUser = user } catch { hasError = true print("获取用户失败:\(error)") } } } // 空请求体结构体(用于无需传参的接口) struct EmptyRequest: Encodable {}
注意:如果fetchUser需要携带authToken鉴权,直接用ViewModel中已有的authToken构造请求头或请求体即可;若无需初始化时就获取用户信息,可将fetchUser移到登录成功后调用,避免init中执行过重异步操作。
内容的提问来源于stack exchange,提问作者AlexTank
相关产品推荐
相关产品推荐

