2015-10-07 14 views
11

irgendeinen Weg gibt, da kann ich zum Beispiel sagen:iOS Alamofire alle Anfragen stoppen

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

Natürlich wäre es toll wenn diese Anfragen speziell beim Bilddownload nur für später pausiert werden wenn ich die gleiche URL anrufe aber ... ich muss zumindest alle Anfragen bei a abbrechen können Globale Ebene. Einige Vorschläge ?

In meiner App habe ich einen Wrapper über die Alamofire.request (.Post ....) Art und Weise Dinge zu tun, so würde ich wirklich schätzen, mich nicht erstellen oder Interaktion mit Manager-Klasse auf eine andere Weise als oben angegeben.

Antwort

9

Sie sollten die NSURLSession Methoden direkt verwenden, um dies zu erreichen.

Alamofire.Manager.sharedInstance.session.invalidateAndCancel() 

Dadurch werden alle Ihre Abschlussbehandlungsroutinen mit Abbruchfehlern aufgerufen. Wenn Sie Downloads fortsetzen können, müssen Sie die resumeData aus der Anfrage holen, wenn sie verfügbar ist. Verwenden Sie dann die Fortsetzungsdaten, um die Anfrage an Ort und Stelle fortzusetzen, wenn Sie bereit sind.

+1

Nach dem Aufruf kann ich keine weitere Anfrage machen –

+0

Sobald Sie eine Sitzung ungültig gemacht haben, müssen Sie eine neue erstellen, um weitere Anfragen zu stellen. Es ist alles in der [Dokumentation] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/#//apple_ref/occ/instm/NSURLSession/invalidateAndCancel). – cnoon

+0

wie kann ich neu erstellen? –

53

cnoon Die One-Liner-Lösung ist großartig, aber es ungültig die NSURLSession und Sie müssen eine neue erstellen.

Eine andere Lösung wäre dies (iOS 7+):

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

Oder wenn Sie iOS Ziel 9+ nur:

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

Wenn Sie URLSession nicht in alamofire konfiguriert haben, können Sie den Standard mit 'Alamofire.SessionManager.default.session' erhalten – Cfr

1

Wenn es hilft, habe ich cnoon Antwort auf meine Arbeit eigene Instanz eines . Ich habe eine Singleton-Klasse namens NetworkHelper, die eine Eigenschaft alamoFireManager hat, die alle meine Netzwerkanforderungen behandelt. Ich rufe einfach die NSURSessioninvalidateAndCancel() auf dieser alamoFireManager Eigenschaft, zurückgesetzt meinen Manager in setAFconfig(), dann bin ich gut zu gehen.

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 Ergänzung zu den @ Loïs Di Qual Sie die Anforderungs-URL überprüfen und Abbrechen (Suspend, Resume) die Anforderung, die Sie benötigen:

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

Unten Code stoppt die Anforderungen in [Swift 3]:

Plus der Code funktioniert für Alamofire v3 & v4 plus für 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() } 
     } 
    } 
} 

Kopieren Sie einfach die Funktion.

Verwandte Themen