Swift 从Alamofire取消所有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)

在我的项目中,有4个web服务在后台运行。我想在从当前状态注销时停止所有这些服务,而不等待响应。我找到了这样做的代码

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;i
NSURLSession
来说,有这些方法可以返回所有尚未完成的请求。您可以获取这些请求,循环遍历它们并取消每一个请求,类似于人们在上面提出的建议

    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() })
        })
    }