swift - 如何在 swift 中为服务器登录创建正确的完成处理程序?

标签 swift api authentication

我的 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/

相关文章:

ios - 滚动 UICollectionView 时如何自定义在顶部屏幕上粘滞的标题 View ?

php - 如何使用 YouTube Data API v3 检查 YouTube 视频是否存在

php - Paypal 沙盒 API 10055 错误?

android - 放大授权: Unable to add User to the Pool

ios - 检测页面何时按下 tabBar 项

ios - UISlider:更改了高度,但最大值闪烁

swift - 在 SwiftUI 中,如何为 UIButton 提供渐变并为该按钮提供具有相同渐变的底部阴影?

javascript - 通过具有请求速率限制器的 API 进行异步请求

android - 无法使用 WebServices API 将数据发布到 Android 中的服务器

authentication - 当资源所有者在 OAuth 2.0 中无法对自己进行身份验证时,授权服务器应该做什么?