Search code examples
swiftweb-servicesswift2nsurlsessionalamofire

Cancel all web service calls from Alamofire


In my project there are 4 web services running in the background. I would like to stop all these services on logout from the current state without waiting for response. I have found this code for doing that

Alamofire.Manager.sharedInstance.session.invalidateAndCancel()

But after calling this, I am not able to make service calls again. Is there any way I can cancel all the running requests?

Here's my service calling code

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

                    }
            }
        }

Solution

  • As far as I can tell there is no obvious/easy way to recreate the session. The suggested way to handle this problem is to keep and array of requests static var requests = [Alamofire.Request?]() then when you want to stop all the requests you can call use request.cancel(). Using this approach you will have to append each request after creating it.

    class func stopAllRequests(){
        for request in MyClass.requests{
            if let request = request{
                request.cancel()
            }
        }
    }
    

    Similar Issue