2015-10-07 11 views
11

C'è un modo per dire ad esempio:fermare iOS Alamofire tutte le richieste

Alamofire.Manager.cancelAllRequests() o Alamofire.Manager.sharedInstance.cancelAllRequests()?

Ovviamente sarebbe bello se queste richieste, specialmente in caso di download di immagini, verrebbero messe in pausa solo in un secondo momento, quando avrò lo stesso URL ma ... Ho bisogno almeno di poter cancellare tutte le richieste ad un livello globale. Alcuni suggerimenti?

Nella mia app ho un wrapper sopra il metodo Alamofire.request (.Post ....

risposta

9

È necessario utilizzare direttamente i metodi NSURLSession per ottenere ciò.

Alamofire.Manager.sharedInstance.session.invalidateAndCancel() 

Questo chiamerà tutti i gestori di completamento con errori di cancellazione. Se è necessario essere in grado di riprendere i download, sarà necessario prendere lo resumeData dalla richiesta, se disponibile. Quindi utilizzare i dati di ripresa per riprendere la richiesta sul posto quando sei pronto.

+1

Dopo aver chiamato questo non riesco a fare nuovamente richiesta –

+0

Dopo aver invalidato una sessione, è necessario crearne una nuova per fare richieste aggiuntive. È tutto nella [documentazione] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/#//apple_ref/occ/instm/NSURLSession/invalidateAndCancel). – cnoon

+0

come posso creare nuovo? –

53

cnoon La soluzione one-liner è ottima ma invalida NSURLSession ed è necessario crearne uno nuovo.

Un'altra soluzione sarebbe questo (iOS 7+):

session.getTasks { dataTasks, uploadTasks, downloadTasks in 
    dataTasks.forEach { $0.cancel() } 
    uploadTasks.forEach { $0.cancel() } 
    downloadTasks.forEach { $0.cancel() } 
} 

O se indirizzare iOS 9+ solo:

session.getAllTasks { tasks in 
    tasks.forEach { $0.cancel() } 
} 
+1

Se non hai configurato URLSession in alamofire, puoi ottenere il valore predefinito con 'Alamofire.SessionManager.default.session' – Cfr

1

Se aiuta, ho avuto la risposta di cnoon a lavorare sul mio propria istanza di un Alamofire.Manager. Ho una classe singleton chiamata NetworkHelper che ha una proprietà chiamata alamoFireManager, che gestisce tutte le mie richieste di rete. Ho appena chiamato il NSURSessioninvalidateAndCancel() su quella proprietà alamoFireManager, reimpostare il mio manager in setAFconfig(), quindi sono a posto.

class NetworkHelper { 

private var alamoFireManager : Alamofire.Manager! 

class var sharedInstance: NetworkHelper { 
    struct Static { 
     static var instance: NetworkHelper? 
     static var token: dispatch_once_t = 0 
    } 

    dispatch_once(&Static.token) { 
     Static.instance = NetworkHelper() 
    } 

    return Static.instance! 
} 
init(){ 
    setAFconfig() 
} 

func setAFconfig(){ 
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.timeoutIntervalForResource = 4 
    configuration.timeoutIntervalForRequest = 4 
    alamoFireManager = Alamofire.Manager(configuration: configuration) 
} 
func cancelAllRequests() { 
    print("cancelling NetworkHelper requests") 
    alamoFireManager.session.invalidateAndCancel() 
    setAFconfig() 
} 
1

In Swift 2,2

let session = Alamofire.Manager.sharedInstance.session 
session.getAllTasksWithCompletionHandler() { tasks in 
    tasks.forEach { $0.cancel() } 
} 
1

in completamento al @ Loïs Di Qual è possibile verificare la richiesta di URL ed annullare (sospendere, riprendere) la richiesta di cui avete bisogno:

downloadTasks.forEach 
      { 
       if ($0.originalRequest?.url?.absoluteString == url) 
       { 
        $0.cancel() 
       } 
      } 
1

Il codice sottostante interrompe le richieste in [Swift 3]:

Più il codice funziona per Alamofire v3 & v4 plus per iOS 8+.

func stopTheDamnRequests(){ 
    if #available(iOS 9.0, *) { 
     Alamofire.SessionManager.default.session.getAllTasks { (tasks) in 
      tasks.forEach{ $0.cancel() } 
     } 
    } else { 
     Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in 
      sessionDataTask.forEach { $0.cancel() } 
      uploadData.forEach { $0.cancel() } 
      downloadData.forEach { $0.cancel() } 
     } 
    } 
} 

Semplicemente copia e incolla la funzione.

Problemi correlati