2015-12-29 7 views
10

In meinem Projekt laufen 4 Web-Dienste im Hintergrund. Ich möchte alle diese Dienste beim Abmelden vom aktuellen Status aus anhalten, ohne auf eine Antwort zu warten. Ich habe diesen Code gefunden, dassAlle Web-Service-Anrufe von Alamofire abbrechen

Alamofire.Manager.sharedInstance.session.invalidateAndCancel() 

dafür aber nach diesem Aufruf, ich bin nicht in der Lage Service-Anrufe wieder zu machen. Gibt es eine Möglichkeit, alle laufenden Anfragen abzubrechen?

Hier ist mein Service Telefonvorwahl

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 

        } 
      } 
     } 
+0

können Sie nur ausstehende Anfrage abbrechen. wenn die Anfrage ausgeführt wird, ist es zu spät ... Sie betreiben überhaupt keine Web-Dienste. – user3441734

+0

Bitte überprüfen Sie diese Antwort http://stackoverflow.com/a/27022598/1030951 – HarshIT

Antwort

2
class func emptyArr() { 
     for(var i=0; i<arrReq.count; i++){ 
      request = arrReq.objectAtIndex(i) as? Alamofire.Request 
      request?.cancel() 
     } 
    } 
9

Soweit ich keine offensichtliche/einfache Möglichkeit, es sagen kann, ist, die Sitzung neu zu erstellen. Der empfohlene Weg, um dieses Problem zu lösen, besteht darin, ein Array von Anfragen zu speichern und zu speichern. Wenn Sie dann alle Anfragen, die Sie anrufen möchten, stoppen möchten, verwenden Sie request.cancel(). Bei dieser Vorgehensweise müssen Sie jede Anfrage anhängen, nachdem Sie sie erstellt haben.

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

Similar Issue

+0

Dies ist für mich der beste Weg, um dies zu handhaben (und die, die ich in meiner App verwende) –

+0

Dies wird die Anfrage nur für eine Klasse abbrechen. –

+0

@ JanakThakkar Die Idee hier ist nur, um alle Ihre Anfragen in einem Array zu speichern. Dieses Array könnte zwischen Klassen oder Hilfen in einer Verwaltungsklasse geteilt werden. –

8

NSURLSession hat diese Methoden, die Sie alle Anfragen zurückgibt, die noch nicht abgeschlossen haben. Sie können diese erhalten, durchlaufen und abbrechen - ähnlich wie die Leute oben angedeutet haben.

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