View onAppear 中的 SwiftUI 补全逻辑

问题描述 投票:0回答:1

我对 SwiftUI 还很陌生。

在此示例中,我通过具有完成处理程序的 API 运行网络请求,以更改应用程序状态,即根据令牌 (JWT) 有效性显示不同的视图。我正在尝试弄清楚如何使用我视图的 .onAppear 中的完成来执行此操作,任何帮助将不胜感激:

查看代码

struct LaunchView: View {

let keychainManager = KeychainManager()
let keychainRecords = KeychainRecords()
let tokenManager = TokenManager()

var validSession: Bool

var body: some View {
    ZStack {
        if validSession {
            HomeView()
        } else {
            LoginView()
        }
    }
    .onAppear(){
        do {
            let token = try keychainManager.getToken(identifier: keychainRecords.identifier, service: keychainRecords.service)
            
            let tokenValidationResponse = try tokenManager.validateToken(token: token){ completion in
                if Result<TokenValidationResponse, NetworkError> {
                    guard let message = tokenValidationResponse.Message else { return }
                    
                    if (message == "Success") {
                        validSession = true
                    } else {
                        validSession = false
                    }
                    
                } else {
                    // Show an error message
                    print("Network request failed")
                }
            }
        } catch {
            print(error)
        }
    }
}

验证码

func validateToken(token: String, completion: @escaping (Result<TokenValidationResponse, NetworkError>) -> Void) {
        
    guard let url = URL(string: BASE_URL + TOKEN) else {
        completion(.failure(.invalidURL))
        return
    }
    
    let body = TokenRequestBody(token: token)
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = try? JSONEncoder().encode(body)
    
    URLSession.shared.dataTask(with: request) { (data, response, error) in
        
        guard let data = data, error == nil else {
            completion(.failure(.noData))
            return
        }
        
        guard let tokenValidationResponse = try? JSONDecoder().decode(TokenValidationResponse.self, from: data) else {
            completion(.failure(.decodingError))
            return
        }
        print(tokenValidationResponse)
        completion(.success(tokenValidationResponse))
        
    }.resume()
}

谢谢(PS,打印时我收到了请求的有效回复)

swift xcode swiftui state completionhandler
1个回答
0
投票

用@State标记你的变量。

@State var validSession: Bool = false
© www.soinside.com 2019 - 2024. All rights reserved.