我有一个处理Apple Push Notification Service
远程通知的方法。执行此方法时,我希望它调用我的服务器并使用HTTP POST
库执行Alamofire
请求。我想执行另一个处理POST请求响应的方法。
我遇到的问题是我使用现有的API
在此POST请求中从服务器获取配置文件。因此,我需要使用此现有API,并确定何时通过远程通知专门触发此配置文件提取。
由于Alamofire
请求是在后台队列中完成的,在从服务器接收到配置文件后,如何执行方法?
解决这个问题的好方法是什么?
谢谢!
答案 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
}