Alamofire 和 completionHandler 的使用

Posted

技术标签:

【中文标题】Alamofire 和 completionHandler 的使用【英文标题】:Using of Alamofire and completionHandler 【发布时间】:2017-05-10 19:03:27 【问题描述】:

大家好,非常感谢您的帮助!我是编程新手,如果 smth 看起来很愚蠢或很奇怪,我很抱歉。

我正在制作我的应用的登录页面。我有 2 个字段 - emailpassword。我创建了一个具有 emailclass、bool isLoggedIn 和 func authenticateUser 属性的类 User >,执行 POST 请求。

我的逻辑:

    用户输入电子邮件密码并按下登录按钮。

    这将创建一个具有 isLoggedInfalse

    的类对象

    它还向服务器执行 POST 请求

    如果响应确认此类用户,isLoggedIn 将更改为 true,并且正在执行转到主页。

对于请求,我使用 Alamofire。如果我理解正确的话,我只能通过使用completionhandler 来更改isLoggedIn 的值。但这对我不起作用 - isLoggedIn 的值没有改变,而第二部分代码中的 resultBool 变为 true。 p>

我确定我有一个错误,但已经 4 天了,我不明白在哪里。我将非常感谢任何形式的建议和帮助。

这是我的代码:

import Foundation
import Alamofire


class User 


    let defaults = UserDefaults.standard

    var email: String
    var password: String
    var isLoggedIn: Bool

    init(email: String, password: String) 
        self.email = email
        self.password = password
        self.isLoggedIn = false
    

    // Perform authentication
    func authenticateUser(user: User, completionHandler: @escaping (_ result: Bool) -> ()) 
        makeAuthenticateUserCall(user: user, completionHandler: completionHandler)
    

    // Perform POST request
    func makeAuthenticateUserCall(user: User, completionHandler: @escaping (Bool) -> ()) 

        let parameters = [
            "email" : user.email,
            "password" : user.password
        ]

        Alamofire.request("http://apistaging.server.com/api/v1/login", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody).responseJSON response in

                switch response.result 
                case .success:
                    if let json = response.result.value as? [String: Any],
                        let status = json["status"] as? String,
                        status == "success" 
                        completionHandler(true)
                    
                case .failure:
                    completionHandler(false)
                
        
    

来自 ViewController 的代码:

@IBAction func loginButtonPressed(_ sender: UIButton) 

        if let email = _email.text 
            if let password = _password.text 
                let user = User(email: email, password: password)
                user.authenticateUser(user: user) resultBool in
                        user.isLoggedIn = resultBool
                    
                if user.isLoggedIn 
                    self.performSegue(withIdentifier: "MainPageViewController", sender: nil)
                
            
        
    

【问题讨论】:

segue 需要在完成处理程序中执行 谢谢,但为什么以及如何? 【参考方案1】:

您在实际返回之前检查了结果:

if let password = _password.text 
    let user = User(email: email, password: password)
    user.authenticateUser(user: user) resultBool in
        user.isLoggedIn = resultBool
        if resultBool 
            DispatchQueue.main.async 
                self.performSegue(withIdentifier: "MainPageViewController", sender: nil)
            
        
    

【讨论】:

以上是关于Alamofire 和 completionHandler 的使用的主要内容,如果未能解决你的问题,请参考以下文章

你如何干净地关闭 AsynchronousSocketChannel?

Alamofire 自定义响应从 Alamofire v1.3 迁移到 3.0(和 Swift 2 语法)

Alamofire:如何处理和分类错误?

哪个是 xcode 7.2 支持的 alamofire 对象映射器和 alamofire pod 版本

让 Alamofire 和 OHHTTPStubs 一起工作

Alamofire 5 调整和重试请求