Swift 从Alamofire取消所有web服务调用
在我的项目中,有4个web服务在后台运行。我想在从当前状态注销时停止所有这些服务,而不等待响应。我找到了这样做的代码Swift 从Alamofire取消所有web服务调用,swift,web-services,swift2,nsurlsession,alamofire,Swift,Web Services,Swift2,Nsurlsession,Alamofire,在我的项目中,有4个web服务在后台运行。我想在从当前状态注销时停止所有这些服务,而不等待响应。我找到了这样做的代码 Alamofire.Manager.sharedInstance.session.invalidateAndCancel() 但是打了这个电话之后,我不能再打服务电话了。有没有办法取消所有正在运行的请求 这是我的服务呼叫代码 func getAllCount(parameters: [String: AnyObject],completion: (success : Bool)
Alamofire.Manager.sharedInstance.session.invalidateAndCancel()
但是打了这个电话之后,我不能再打服务电话了。有没有办法取消所有正在运行的请求
这是我的服务呼叫代码
func getAllCount(parameters: [String: AnyObject],completion: (success : Bool) -> Void) {
PKHUD.sharedHUD.contentView = PKHUDTextView(text: "Loading...")
PKHUD.sharedHUD.show()
request = Alamofire.request(.POST, GlobalConstants.KGetAllCount, parameters: parameters, encoding:.JSON).responseJSON
{
response in switch response.result {
case .Success(let JSON):
PKHUD.sharedHUD.hide()
print("Success with JSON: \(JSON)")
let status : NSString = JSON.valueForKey("status") as! String
if(status .isEqualToString("1")){
MyViewState.QJoined = JSON.valueForKeyPath("data.TotalJoinQueue") as! String
MyViewState.Qstarted = JSON.valueForKeyPath("data.TotalCreatedQueue") as! String
MyViewState.Bumps = JSON.valueForKeyPath("data.TotalBump") as! String
completion(success: true)
break
}else{
completion(success: false)
Helper.globalAlert(JSON.valueForKey("data") as! String)
break
}
case .Failure(let error):
PKHUD.sharedHUD.hide()
print("Request failed with error: \(error)")
completion(success: false)
break
}
}
}
据我所知,没有明显/简单的方法来重新创建会话。处理此问题的建议方法是保留和排列请求
static var requests=[Alamofire.Request?]()
,然后当您想要停止所有可以调用的请求时,使用Request.cancel()
。使用这种方法,您必须在创建每个请求后追加它
class func stopAllRequests(){
for request in MyClass.requests{
if let request = request{
request.cancel()
}
}
}
类函数清空器(){
对于(var i=0;iNSURLSession
来说,有这些方法可以返回所有尚未完成的请求。您可以获取这些请求,循环遍历它们并取消每一个请求,类似于人们在上面提出的建议
if #available(iOS 9.0, *) {
Manager.sharedInstance.session.getAllTasksWithCompletionHandler { (tasks) -> Void in
tasks.forEach({ $0.cancel() })
}
} else {
// Fallback on earlier versions
Manager.sharedInstance.session.getTasksWithCompletionHandler({
$0.0.forEach({ $0.cancel() })
$0.1.forEach({ $0.cancel() })
$0.2.forEach({ $0.cancel() })
})
}
您只能取消挂起的请求。如果请求正在执行,则会很晚…您根本没有运行web服务。请查看此答案这是我处理此问题的最佳方法(以及我在应用程序中使用的方法)这将只取消对一个类的请求。@JanakThakkar这里的想法是将所有请求存储在一个数组中。这个数组可以在类之间共享,也可以在管理类中提供帮助。
if #available(iOS 9.0, *) {
Manager.sharedInstance.session.getAllTasksWithCompletionHandler { (tasks) -> Void in
tasks.forEach({ $0.cancel() })
}
} else {
// Fallback on earlier versions
Manager.sharedInstance.session.getTasksWithCompletionHandler({
$0.0.forEach({ $0.cancel() })
$0.1.forEach({ $0.cancel() })
$0.2.forEach({ $0.cancel() })
})
}