我对 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,打印时我收到了请求的有效回复)
用@State标记你的变量。
@State var validSession: Bool = false