当前位置:  开发笔记 > 编程语言 > 正文

在Alamofire关闭回归Bool

如何解决《在Alamofire关闭回归Bool》经验,为你挑选了1个好方法。

我使用Swift 2和Xcode 7.1.

我有一个连接我的用户的功能,但它将使用HTTP连接我的数据库.我使用Alamofire执行此请求.我想知道,如果用户已连接,则从视图控制器.

我的功能连接在一个类中.我在ViewController中测试连接.像这样 :

    class user {

    // ...

    func connectUser(username: String, password: String){

        let urlHost = "http://localhost:8888/project350705/web/app_dev.php/API/connect/"
        let parametersSymfonyG = [
            username, password
        ]
        let url = UrlConstruct(urlHost: urlHost).setSymfonyParam(parametersSymfonyG).getUrl()

        //var userArray = [String:AnyObject]()

        Alamofire.request(.GET, url)
            .responseString { response in

                if let JSON = response.result.value {

                    var result = self.convertStringToDictionary(JSON)!

                    if result["status"] as! String == "success"{
                        let userArray = result["user"] as! [String:AnyObject]
                        userConnect = self.saveUser(userArray)
                    } else{
                        print("ERROR-CONNECTION :\n Status :\(result["status"]!)\n Code :\(result["code"]!)")
                    }
                    return ""
                }
        }
    }

    // ...
}

class MyViewController: UIViewController {

    // ...

    @IBAction func connect(sender: AnyObject?) {

        // CONNECTION
        User.connectUser(self.username.text!, password: self.password.text!)

        // CHECK
        if userConnect != nil {
            print("connected")
        }else{
            print("NotConnected")
        }
    }

    // ...

}

第一个解决方案:返回

要这样做,我的函数将返回一个布尔值.只有我不能使用退货.

Alamofire.request(.GET, url)
        .responseString { response in

            if let JSON = response.result.value {

                var result = self.convertStringToDictionary(JSON)!

                if result["status"] as! String == "success"{
                    let userArray = result["user"] as! [String:AnyObject]
                    userConnect = self.saveUser(userArray)
                } else{
                    print("ERROR-CONNECTION :\n Status :\(result["status"]!)\n Code :\(result["code"]!)")
                }
                return "" // Unexpected non-void return value in void function
            }
    }

二解决方案:

我还可以测试用户是否已经登录,但在测试之前,我必须等待功能已经完成加载.

users.connectUser(self.username.text!, password: self.password.text!)

// after 
if userConnect != nil {
    print("connected")
}else{
    print("NotConnected")
}

我宁愿返回一个布尔值.它将促进处理.你有解决方案吗 ?



1> Rob..:

我建议在你的connectUser方法中使用一个完成处理程序:

func connectUser(username: String, password: String, completion: @escaping (Bool) -> Void) {
    // build the URL

    // now perform request

    Alamofire.request(url)
        .responseString { response in
            if let json = response.result.value, let result = self.convertStringToDictionary(json) {
                completion(result["status"] as? String == "success")
            } else {
                completion(false)
            }
    }
}

然后你可以用它来调用它:

users.connectUser(username.text!, password: password.text!) { success in
    if success {
        print("successful")
    } else {
        print("not successful")
    }
}
// But don't use `success` here yet, because the above runs asynchronously

顺便说一句,如果你的服务器真的在生成JSON,你可以使用responseJSON而不是responseString进一步简化代码,并且不再需要convertStringToDictionary:

func connectUser(username: String, password: String, completion: @escaping (Bool) -> Void) {
    // build the URL

    // now perform request

    Alamofire.request(url)
        .responseJSON { response in
            if let dictionary = response.result.value as? [String: Any], let status = dictionary["status"] as? String {
                completion(status == "success")
            } else {
                completion(false)
            }
    }
}

如果您编写了自己的服务器代码来验证用户身份,请确保设置正确的标头(因为responseJSON不仅为您进行JSON解析,而且作为其验证过程的一部分,它确保标头指定JSON正文;无论如何设置标题是一种好习惯.例如在PHP中,在你echo使用JSON 之前,像这样设置标题:

header("Content-Type: application/json");

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有