ios - 同步认证 SwiftUI
问题描述
我正在使用需要登录的 SwiftUI 制作 iOS 应用程序。当按下创建帐户按钮时,该操作会触发我的 NetworkManager 类中的一个函数,该函数将输入的电子邮件和密码作为发布请求发送并接收适当的数据返回以进行身份验证。然后它使用接收到的数据来确定凭证是否有效
我的问题是它运行的代码会在实际收到响应之前根据 API 响应验证输入的凭据。因此,每次的结果都是相同的。
Button(action: {
self.networkManager.signUp(email: self.inputEmail, password: self.inputPassword)
// These if statements run before the above line is executed
if self.networkManager.signUpResponse.code == nil {
// SUCCESSFUL REGISTRATION
ProgressHUD.showSuccess("Account Successfully Created!")
UserDefaults.standard.set(true, forKey: "LoggedIn")
self.showingWelcomePage = false
}
if self.networkManager.signUpResponse.code == 201 {
// REGISTRATION FAILED
ProgressHUD.showError("This account already exists", interaction: false)
}
}) {
Text("Create Account")
.font(.headline)
}
我曾尝试使用 DispatchQueue.main.async() 或创建自己的线程,但似乎没有任何效果。我需要找到一种方法来暂停主线程,以便在不使用 DispatchQueue.main.sync() 的情况下等待这行代码执行,因为这会导致死锁和程序崩溃。
这是向 API 发出 post 请求的函数的代码
class NetworkManager: ObservableObject {
@Published var signUpResponse = AccountResults()
func signUp(email: String, password: String) {
if let url = URL(string: SignUpAPI) {
let session = URLSession.shared
let bodyData = ["school": "1",
"email": email,
"password": password]
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = try! JSONSerialization.data(withJSONObject: bodyData)
let task = session.dataTask(with: request) { (data, response, error) in
if error == nil {
let decoder = JSONDecoder()
if let safeData = data {
do {
let results = try decoder.decode(AccountResults.self, from: safeData)
DispatchQueue.main.async {
self.signUpResponse = results
}
} catch {
print(error)
}
}
}
}
task.resume()
}
}
}
提前致谢!
解决方案
试试看:
func signUp(email: String, password: String, completion: @escaping((Error?, YourResponse?) -> Void)) {
if let url = URL(string: SignUpAPI) {
let session = URLSession.shared
let bodyData = ["school": "1",
"email": email,
"password": password]
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = try! JSONSerialization.data(withJSONObject: bodyData)
let task = session.dataTask(with: request) { (data, response, error) in
if error == nil {
let decoder = JSONDecoder()
if let safeData = data {
do {
let results = try decoder.decode(AccountResults.self, from: safeData)
DispatchQueue.main.async {
self.signUpResponse = results
completion(nil, results)
}
} catch {
print(error)
completion(error, nil)
}
}
}
}
task.resume()
}
}
}
在你的函数中使用转义,我认为会得到准确的点服务器响应数据或得到错误。我的英语太差了。
推荐阅读
- java - 刽子手游戏:卡在随机选择玩家
- node.js - Express TypeError: Router.use() 需要一个中间件函数,但有一个未定义的
- dart - Dart - 将重复字符添加到整数
- node.js - 在 Nest.JS 中将服务注入警卫
- swift - 推送没有情节提要的 ViewController
- windows - 如何通过 ssh 从 powershell 脚本获取输出?
- mapzen - Nextzen 按数据类型过滤
- oracle - Oracle:过程/光标 - UPDATE、SET
- excel - 每次 dvar == 1 时显示来自变量决策的参数
- c - C中的跳过列表实现