swift - 如何在 swift 中为服务器登录创建正确的完成处理程序?
问题描述
我的 swift 应用程序中有一个 api 管理器类,它有一个带有用户名和密码的服务器登录。我想知道如何为它创建一个完成处理程序,当服务器以 200 状态代码响应时,该函数处理该响应,例如在视图控制器中执行一个 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
方法,例如:
login(username: someUsername, password: somePassword) { (result) in
if result == 1 {
// success - do your segue
} else if result == 0 {
// bad username/password
} else {
// some error
}
}
推荐阅读
- python - 我刚开始使用 python,我需要帮助在 python 中提出数学问题
- javascript - 显示加载器元素直到页面加载,然后隐藏它
- android - 如何从fire base android中的所有子nidra中删除特定密钥
- python - 没有多个页面的唯一 URL,没有发出 XHR 请求
- r - R - 在 for 循环中按顺序删除列
- node.js - 如何将图像源转换为 JavaScript File 对象
- javascript - 如何用 jest 模拟 azure-storage 表服务功能?
- c++ - operator+ 的规范实现涉及额外的移动构造函数
- c# - 在类中初始化变量的最佳实践,可用于 C# 中的所有方法
- jupyter-notebook - 从 float64 到 uint8 的有损转换。范围 [0, 1]。在保存之前将图像转换为 uint8 以抑制此警告