等待响应 Alamofire Swift

4

在执行函数之前,我需要等待 response.response?.allHeaderFields 数据的响应。我已经搜索了网络,但是并没有很清楚地了解如何将“完成处理程序”添加到 Alamofire 请求中。或者还有其他方法使函数等待。

@IBAction func comfirmation(sender: UIButton) {
    if CodeTextField.text != "" {
        print("in comfirmation function")
        let comfirmationRequestData = [
            "phone" : "\(appDelegate.savedNumber)",
            "code" : "\(CodeTextField.text!)"
        ]
        Alamofire.request(.POST,
            "http://192.168.214.241:4000/login",
            parameters: comfirmationRequestData,
            encoding: .JSON).responseJSON {
                response in
                switch response.result {
                case .Success:
                    let jsonDecrypted = JSON(response.result.value!)
                    print(jsonDecrypted)
                    let headerFile = response.response?.allHeaderFields as? [String:String]
                    print(headerFile)

                case .Failure(let error):
                    print(error)
                }
        }
        print("in comfirmation function. success")
        appDelegate.defaults.setValue(appDelegate.savedNumber, forKey: "phoneNumber")
    } else {
        print("in comfirmation function. failed")
    }

}

1
这是我一段时间前编写的完成处理程序示例。点击此处查看。 - Eric Aya
使用回调函数来获取响应,为什么要等待... - Amit Singh
3个回答

4
像这样使用Alamofire
func postRequest( urlSuffix : String, params:[String : AnyObject]?, filterParams : [String]?, success: (response: AnyObject!) -> Void, failure: (error: NSError?) -> Void)
{
    Alamofire.request(.POST, webServicesURLPrefix + urlSuffix, parameters: params, encoding: .JSON, headers: self.headers)
    request?.responseJSON { response in
        switch response.result
        {
        case .Success:
            success(response: response.result.value)
        case .Failure(let error):
            failure(error: error)
        }
    }
}

可以在任何地方调用该方法,如下:

self.postRequest("do-registration.php", params: params, filterParams: nil, success: { (response) -> Void in
        self.afterResponse(response)
        }) { (error) -> Void in
            failure(error: error)
    }

或者您可以编写一个单独的方法,在完成后需要调用该方法。

func afterResponse(responseData : AnyObject)
{
    print("Done")
    print(responseData)
}

如果我在函数末尾添加print("done"),它会在打印返回的数据之前先打印出来。 - JuicyFruit
如果您希望在操作完成后执行命令,则必须将命令写在块内部。 - Amit Singh
我不确定你是否理解我的意思,我想要做的是将异步的Alamofire请求变成同步的。 - JuicyFruit
如果这样做,同步操作将会阻塞您的用户界面。 - Amit Singh
@AmitSingh 我需要在运行测试之前从服务器加载一些数据。 - RustamG
显示剩余3条评论

1
你可以使操作同步,但为了做到这一点,你需要在Alamofire请求之前设置一个信号量,并在完成处理程序中释放它。你会在启动Alamofire后立即等待信号量。

1
信号量和调度组一样糟糕。Alamofire请求 - 以及NSURLSession的等效请求 - 都设计为异步工作,并应相应地处理。 - vadian
我并没有说这是一个好主意,我只是说它可以满足他的请求。不是吗? - Feldur

0

有一个库Alamofire-Synchronous,它使用信号量进行工作。

样例:

//json
let response = Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON()
if let json = response.result.value {
    print(json)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接