我的 swift 应用程序中有一个 api 管理器类,它有一个使用用户名和密码的服务器登录。 我想知道如何为其创建一个完成处理程序,当服务器以 200 状态代码响应时,该函数会处理该响应,例如在 View Controller 中执行 segue。 我没有找到任何这方面的教程。感谢您的帮助!
编辑1: 我需要的是:调用函数时立即运行完成处理程序。我希望完成处理程序在服务器响应后运行。
这是我的登录功能:
public class func Login(username: String, password: String, complitionHandler: @escaping (Int) -> Void) {
let urlS = "http://server.com/" + "login.php"
let url = URL(string: urlS)
var request = URLRequest(url: url!)
request.httpMethod = "POST"
let body = "username=\(username.lowercased())&password=\(password)"
request.httpBody = body.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data, error == nil else {
print(error!)
print("error")
logedIn = 2
return
}
do{
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary
if let parseJson = json {
let code = parseJson["status"] as! String
if code == "200" {
print("loged inn")
logedIn = 1
}else if code == "400" {
print("uuuser/pass error")
logedIn = 0
}
}
}catch{
print("json error")
logedIn = 2
}
}
task.resume()
DispatchQueue.main.async {
complitionHandler(logedIn)
}
}
以及我如何在 ViewController 中调用该函数:
Manager.Login(username: "1", password: "1") { (i) in
switch i {
case 0:
print("user/pass error")
case 1:
print("loged in")
self.performSegue(withIdentifier: "toMain", sender: self)
case 2:
print("json error")
default:
()
}
}
最佳答案
所有的部分都已就位。您只需将对完成处理程序的调用移至正确的位置即可:
}catch{
print("json error")
logedIn = 2
}
DispatchQueue.main.async {
complitionHandler(logedIn)
}
}
task.resume()
另请注意,方法名称应以小写字母开头,因此您的 Login
函数应命名为 login
。
现在您可以使用此登录
方法,例如:
login(username: someUsername, password: somePassword) { (result) in
if result == 1 {
// success - do your segue
} else if result == 0 {
// bad username/password
} else {
// some error
}
}
关于swift - 如何在 swift 中为服务器登录创建正确的完成处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50201521/