Swift 2 - 使用 Alamofire 时函数不返回 Bool

Posted

技术标签:

【中文标题】Swift 2 - 使用 Alamofire 时函数不返回 Bool【英文标题】:Swift 2 - Function not return Bool when using Alamofire 【发布时间】:2015-11-20 12:41:29 【问题描述】:

我正在创建一个静态函数来检查用于注册的用户电子邮件是否正在使用中。如果电子邮件正在使用中,该函数应返回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
        



【问题讨论】:

【参考方案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
    

【讨论】:

非常感谢。这是一个非常有价值的答案。【参考方案2】:

该函数将始终返回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)
                
        
    

【讨论】:

【参考方案3】:
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
*/

您必须设计自己的同步机制。一般来说,如果你需要某个函数执行的结果,则该函数必须同步执行。

【讨论】:

以上是关于Swift 2 - 使用 Alamofire 时函数不返回 Bool的主要内容,如果未能解决你的问题,请参考以下文章

不使用框架手动集成 Alamofire 2

使用 alamofire 2.0 和 Swift 2.0 的 POST 请求

如何使用 Alamofire (Swift 2.2) 获取 Twitter 访问令牌

如何使用 Swift 5 在 Xcode 10.2.1 中添加 alamofire

在 Alamofire Swift 2.2 中使用 completionHandler

Alamofire 奇怪的 JSON 前缀 - Swift 2.0