在 Alamofire Post 请求之后如何有一个完成处理程序/块?
Posted
技术标签:
【中文标题】在 Alamofire Post 请求之后如何有一个完成处理程序/块?【英文标题】:How to have a completion handler/block after Alamofire Post request? 【发布时间】:2015-01-05 00:43:11 【问题描述】:我有一个处理Apple Push Notification Service
远程通知的方法。执行此方法时,我希望它调用我的服务器并使用Alamofire
库执行HTTP POST
请求。我想执行另一种方法来处理 POST 请求的响应。
对我来说,问题是我正在使用现有的API
在此 POST 请求中从服务器获取配置文件。所以我需要使用这个现有的 API 并确定何时从远程通知专门触发了此配置文件获取。
由于Alamofire
请求是在后台队列中完成的,我将如何在从服务器接收回配置文件后执行方法?
解决这个问题有什么好的选择?
谢谢!
【问题讨论】:
为什么不在您的 POST 请求中使用标准的 Alamofireresponse
块?当您的应用收到响应时,您的 response
块将被执行,然后可以调用您喜欢的任何逻辑。
@JonathanHersh 我已经在使用response
块来处理获取配置文件响应,但想知道是否有一种特殊的方法可以传入closure
来处理特定实例。对于这种情况,我正在获取配置文件以响应remote notification
。其他时候,当我获取配置文件时,它只是被调用。
抱歉,不清楚您在问什么。响应块是一个闭包。
@JonathanHersh 我的想法是希望能够在获取配置文件(服务器 api 调用)时区分它是来自远程通知还是普通调用。我想我会为此设置一个Bool
标志。
没有看到你的代码很难说更多。您的应用程序的逻辑应该能够自行确定它是否作为推送通知的结果启动请求。
【参考方案1】:
由于 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 会调用完成处理程序。
【讨论】:
另外,.responseJSON 方法也很有用。 因为这是异步代码,如果 Alamofire 抛出,你必须捕捉。是这样吗?还是您始终可以访问 response.result.error?【参考方案2】:从您的问题表述中不清楚您要解决什么问题。但是您已经在上面的问题 cmets 中阐明了您的意图。
根据我现在理解的问题,您有一些代码可以更新服务器上的配置文件并处理服务器的响应。该代码在两种情况下调用,一种由用户手动请求启动,另一种由推送通知启动。在第一种情况下,您不想在处理来自服务器的响应后生成警报,但在第二种情况下,您会这样做。
您确实有一个闭包,您可以使用它来处理不同的行为,即使差异发生在进程的异步部分。这是它的外观草图(不是实际的工作代码):
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()
注意传递给updateProfile
方法的showAlert
参数。如果你传入true
,它会在收到服务器响应后调用showProfileWasUpdatedAlert
方法来显示你的警报。请注意,这个布尔值被处理 Alamofire 响应的闭包“捕获”,因为闭包是在 updateProfile
函数内部定义的。
恕我直言,这比在 AppDelegate 中声明应用全局更好。
【讨论】:
【参考方案3】:给你
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
【讨论】:
以上是关于在 Alamofire Post 请求之后如何有一个完成处理程序/块?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Alamofire 4.0 中仅使用参数和正文在 swift 中使用 POST 方法发送请求?
如何在 Alamofire Swift 的 POST 请求中添加标头参数(-H、-u、-X、-d)