You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中两类间信息共享及AuthViewModel与NetworkManager交互问题

解决方案

问题1:在NetworkManager中获取AuthViewModel的email和password

NetworkManager作为独立的网络工具类,不应直接依赖AuthViewModel,正确做法是通过方法参数传递所需数据,避免耦合:

  1. 先定义包含email和password的请求结构体(符合Encodable):
struct LoginRequest: Encodable {
    let email: String
    let password: String
}
  1. 在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
    }
}
  1. 建议将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:06:31