如何在Alamofire Post请求后拥有一个完成处理程序/块?

时间:2015-01-05 00:43:12

标签: ios swift alamofire completionhandler completion-block

我有一个处理Apple Push Notification Service远程通知的方法。执行此方法时,我希望它调用我的服务器并使用HTTP POST库执行Alamofire请求。我想执行另一个处理POST请求响应的方法。

我遇到的问题是我使用现有的API在此POST请求中从服务器获取配置文件。因此,我需要使用此现有API,并确定何时通过远程通知专门触发此配置文件提取。

由于Alamofire请求是在后台队列中完成的,在从服务器接收到配置文件后,如何执行方法?

解决这个问题的好方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

  

由于Alamofire请求是在后台队列中完成的,在从服务器接收到配置文件后,如何执行方法呢?

响应处理内置于Alamofire。你可以这样做(改编自the docs):

Alamofire.request(.POST, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .response { (request, response, data, error) in
                     println(request)
                     println(response)
                     println(error)
                   }

注意.response方法调用,它向请求对象添加完成处理程序;当请求完成(或失败)时,Alamofire会调用完成处理程序。

答案 1 :(得分:1)

从你的问题表达中不清楚你试图解决什么问题。但是你已经在上面的问题评论中澄清了你的意图。

正如我现在理解的那样,你有一些代码可以更新服务器上的配置文件并处理服务器的响应。代码在两个上下文中调用,一个由用户的手动请求启动,另一个由推送通知启动。在第一种情况下,您不希望在处理来自服务器的响应后生成警报,但在第二种情况下,您不会生成警报。

你确实有一个闭包可以用来处理不同的行为,即使这个过程的异步部分发生了差异。这是一个草图(而不是实际工作代码),它可能看起来如何:

func updateProfile(parameters: [String:String], showAlert: Bool) {
    Alamofire.request(.POST, "http://myserver.com/profile", parameters: parameters)
             .response { (request, response, data, error) in
                         if (error == nil) {
                           processProfileResponse(response)
                           if showAlert {
                             showProfileWasUpdatedAlert()
                           }
                         }
                   }      

}

请注意传递给showAlert方法的updateProfile参数。如果您传入true,则会在收到服务器响应后调用showProfileWasUpdatedAlert方法显示您的提醒。请注意,处理Alamofire响应的闭包“捕获”此布尔值,因为闭包是在updateProfile函数内定义的。

这是恕我直言,比在AppDelegate中声明应用程序全局更好的方法。

答案 2 :(得分:1)

你去吧

func AlamofireRequest(method: Alamofire.Method, URLString: URLStringConvertible, parameters: [String : AnyObject]?, encoding: ParameterEncoding, headers: [String : String]?) -> Alamofire.Result<String>? {
    var finishFlag = 0
    var AlamofireResult: Alamofire.Result<String>? = nil
    Alamofire.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers)
        .responseString { (_, _, result) -> Void in
            if result.isSuccess {
                finishFlag = 1
                AlamofireResult = result
            }
            else {
                finishFlag = -1
            }
    }
    while finishFlag == 0 {
        NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture())
    }
    return AlamofireResult
}