Swift 2 - 使用Alamofire时功能不返回Bool

时间:2015-11-20 12:41:29

标签: function boolean swift2 alamofire

我正在创建一个静态函数,用于检查用户注册的电子邮件是否正在使用中。如果电子邮件正在使用中,则该函数应返回true,否则false

我的代码总是返回false,似乎我使用的变量没有更新。

任何想法我做错了什么,为什么这不能按预期工作?

    class userInfo: NSObject {

    static func userRegistration(email: String) -> Bool {

           var emailIsavailable = false

            Alamofire.request(.GET, "https://example/check_email.php?email=\(email)")


                .responseString{ response in


                    if let responseValue = response.result.value {

                        print("Response String: \(responseValue)")

                        if responseValue == "email is available"{


                            print("email available")

                            emailIsavailable = true //emailIsavailable is not updated

                        }else{


                            print("email not available")

                           emailIsavailable = false //emailIsavailable is not updated


                        }

                    }
            }



            return emailIsavailable // returns always false
        }


}

3 个答案:

答案 0 :(得分:1)

因为它在不同的线程中运行所以你不能直接返回。您应该使用回调(或其他调用块,闭包)。你应该编辑代码:

   class userInfo: NSObject {

static func userRegistration(email: String, callBack : (emailIsavailable : Bool) -> Void) {



        Alamofire.request(.GET, "https://example/check_email.php?email=\(email)")


            .responseString{ response in


                if let responseValue = response.result.value {

                    print("Response String: \(responseValue)")

                    if responseValue == "email is available"{


                        print("email available")

                        callBack(emailIsavailable: true)

                    }else{


                        print("email not available")

                      callBack(emailIsavailable: false)


                    }

                }
        }
    }
}

你可以这样打电话:

yourInstance.userRegistration("test") { (emailIsavailable) -> Void in
        //you can get emailIsavaiable or something here
    }

答案 1 :(得分:0)

该功能将始终返回false,因为启动的网络请求是异步(并且该请求的响应可以更改emailIsavailable的值)。

异步基本上意味着响应不会与该功能的执行同步接收。

我建议通过删除返回类型-> Bool来更改该函数签名,并添加完成处理程序作为参数。然后,在收到响应时,您将调用该处理程序。

有些事情:

class userInfo: NSObject {

    static func userRegistration(email: String, completionHandler: ((String) -> Void)) {

        Alamofire.request(.GET, "https://example/check_email.php?email=\(email)")
            .responseString{ response in

                if let responseValue = response.result.value {
                    completionHandler(responseValue)
                }
        }
    }
}

答案 2 :(得分:0)

import Foundation

func foo() -> Bool {
    var ret = false
    // asynchronous code

    // asyn will return immediately !!!
    async { () -> () in
        ret = true
        print("print ret from completion block:", ret)
    }
    // ret value is false at this point
    return ret
}

// this function is executed on its own queue. (aka Alamofire do)
func async(completion: ()->()) {
    let queue = dispatch_queue_create("async", DISPATCH_QUEUE_CONCURRENT)
    dispatch_async(queue) { () -> Void in
        // do something and then
        // execute completion
        completion()
    }
}

// will always return false !!
print("foo return:", foo())


/*
foo return: false
print ret from completion block: true
*/

您必须设计自己的同步机制。通常,如果需要执行某些函数的结果,则必须同步执行该函数。