2015-12-29 31 views
10

Nel mio progetto ci sono 4 servizi Web in esecuzione in background. Vorrei interrompere tutti questi servizi al logout dallo stato corrente senza attendere la risposta. Ho trovato questo codice per farloAnnulla tutte le chiamate di servizio Web da Alamofire

Alamofire.Manager.sharedInstance.session.invalidateAndCancel() 

Ma dopo aver chiamato questo, non sono in grado di effettuare nuovamente chiamate di servizio. C'è un modo per cancellare tutte le richieste in corso?

Ecco il mio servizio chiamando il codice

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

è possibile annullare solo la richiesta in sospeso. se la richiesta è in esecuzione, è troppo tardi ... non esegui affatto servizi Web. – user3441734

+0

Si prega di rivedere questa risposta http://stackoverflow.com/a/27022598/1030951 – HarshIT

risposta

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

Per quanto ne so non esiste un modo ovvio/facile per ricreare la sessione. Il modo suggerito per gestire questo problema è quello di mantenere e la matrice di richieste static var requests = [Alamofire.Request?]() quando si desidera interrompere tutte le richieste che è possibile chiamare utilizzare request.cancel(). Utilizzando questo approccio dovrai aggiungere ogni richiesta dopo averla creata.

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

Similar Issue

+0

Questo è per me il modo migliore per gestire questo (e quello che uso nella mia app) –

+0

Questo annullerà la richiesta per una sola classe. –

+0

@JanakThakkar l'idea qui è solo per memorizzare tutte le tue richieste in un array. Questo array può essere condiviso tra classi o aiuti in una classe di gestione. –

8

NSURLSession ha questi metodi che si restituisce tutte le richieste che non hanno ancora completato. Puoi ottenerle, visualizzarle e annullarle singolarmente, in modo simile a quanto suggerito sopra.

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