2016-04-17 4 views
0

Ich schreibe eine iOS-App, die darauf angewiesen ist, zu erkennen, wann ein Benutzer mit dem WLAN verbunden ist und, wenn er sich verbindet oder trennt, eine asynchrone Anfrage mit Alamo Fire sendet.Wiederholen Sie eine asynchrone Anfrage, wenn es fehlschlägt?

Das erste Mal, das ich verbinde, ist meine asynchrone erfolgreich.

Jedoch, nachdem ich zuerst verbunden habe, führt jedes Umschalten des wifi in 404s.

Ich vermute, dies liegt daran, dass ich die Anfrage sende, sobald der Benutzer verbindet/trennt, was bedeutet, dass er oder sie für einen kurzen Moment keinen Internetdienst hat.

Meine Frage ist, kann ich die Anfrage wiederholen, wenn es fehlschlägt, oder ist es möglich, die Anfragen zu "cachen", die ich machen möchte und warten, bis der Benutzer eine Internetverbindung hat, um sie zu machen?

Antwort

0

Es gibt viele Lösungen, um dies zu lösen. Eine davon ist die Download-Methode aufrufen rekursiv wieder und so einen automatischen Wiederholungsmechanismus auf Fehler Implementierung:

func downloadSomething() { 
    Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) 
      .response { request, response, data, error in 
       if let error = error { 
        log(error) 
        self.downloadSomething() // recursive call to downloadSomething 
       } else { 
        // do something on success 
       } 
       } 
} 

Sie diese erweitern können:

  • den Benutzer zeigt auch eine Altert Ansicht ihn zu fragen, ob er das will Wiederholen Sie den Download oder nicht bevor Sie den Download erneut versuchen. (abhängig von Ihrer UI-Strategie bei Netzwerkfehlern)
  • eine bestimmte Anzahl von automatischen Re-trys und dann fragen Sie den Benutzer.
  • Überprüfung des Fehlerstatuscode und dann je nach Code do verschiedene Netz Strategien zur Fehlerbehandlung ...
  • etc ...
0

Ich denke, es ist nicht notwendig, um neu erfundene Apfel Code wie reachability oder Swiftreachability Portierung. Sie können in der Lage zu überprüfen, ob ein Benutzer auf das Netz oder WLAN sehr leicht angeschlossen ist:

class func hasConnectivity() -> Bool { 
    let reachability: Reachability = Reachability.reachabilityForInternetConnection() 
    let networkStatus: Int = reachability.currentReachabilityStatus().rawValue 
    return networkStatus != 0 
} 

für eine Wi-Fi-Verbindung:

(reachability.currentReachabilityStatus().value == ReachableViaWiFi.value)