Die Prüfung für mehrere asynchrone Antworten von Alamofire und Swift

Ich Schreibe eine Anwendung, die hängt davon ab, Daten verschiedener Standorte/service, und beinhaltet die Durchführung von Berechnungen basieren auf den Daten aus diesen verschiedenen Quellen zu produzieren ein Endprodukt.

Ich geschrieben habe eine Beispiel-Klasse mit zwei Funktionen unten, sammelt Daten aus den beiden Quellen. Ich habe gewählt, um die verschiedenen Funktionen, denn manchmal wenden wir verschiedene Methoden für die Authentifizierung, je nach Quelle, aber in diesem Beispiel habe ich einfach entkleidet Sie bis auf Ihre einfachste form. Beide Funktionen verwenden Alamofire das Feuer aus und Griff zu den Anforderungen.

Dann habe ich eine Initialisierungs-Funktion, die sagt, wenn wir erfolgreich sammeln Daten aus beiden Quellen, dann laden Sie andere nib-Datei, andernfalls warten Sie, bis Sekunden, wenn keine Antwort zurückgesendet wird, dann laden Sie ein server-Fehler nib-Datei.

Habe ich versucht, dieses Beispiel so einfach wie möglich. Im wesentlichen. Dies ist die Art von Logik, die ich verfolgen möchte. Leider scheint es die derzeit nicht arbeiten, in der aktuellen Implementierung.

import Foundation

class GrabData{
    var data_source_1:String?
    var data_source_2:String?

    init(){    
        //get data from source 1
        get_data_1{ data_source_1 in
            println("\(data_source_1)")
        }

        //get data from source 2
        get_data_2{ data_source_1 in
            println("\(data_source_1)")
        }

        var timer = 0;
        while(timer<5){
            if((data_source_1 == nil) && (data_source_2 == nil)){
                //do nothing unless 4 seconds has elapsed
                if (timer == 4){
                    //load server error nib
                }
            }else{
                //load another nib, and start manipulating data
            }
            //sleep for 1 second
            sleep(1)
            timer = timer+1
        }    
    }

    func get_data_1(completionHandler: (String) -> ()) -> () {
        if let datasource1 = self.data_source_1{
            completionHandler(datasource1)
        }else{
            var url = "http://somewebsite.com"
            Manager.sharedInstance.request(.GET, url).responseString {
                (request, response, returnedstring, error) in
                println("getting data from source 1")
                let datasource1 = returnedstring
                self.data_source_1 = datasource1
                completionHandler(datasource1!)
            }
        }
    }

    func get_data_2(completionHandler: (String) -> ()) -> () {    
        if let datasource2 = self.data_source_2{
            completionHandler(datasource2)
        }else{
            var url = "http://anotherwebsite.com"
            Manager.sharedInstance.request(.GET, url).responseString {
                (request, response, returnedstring, error) in
                println("getting data from source 2")
                let datasource2 = returnedstring
                self.data_source_2 = datasource2
                completionHandler(datasource2!)
            }
        }
    }
}

Ich weiß, dass ich könnte setzen Sie die zweite Schließung innerhalb der ersten innerhalb der init-Funktion, aber ich glaube nicht, dass dies das beste wäre, der Praxis und ich bin eigentlich das ziehen von mehr als 2 Quellen, so dass die Schließung wäre n Verschlüsse tief.

Jede Hilfe, um herauszufinden, der beste Weg, um zu prüfen, ob mehrere Daten Quellen Gaben eine gültige Antwort, und der Umgang, der angemessen wäre sehr geschätzt werden.

InformationsquelleAutor jonhurlock | 2015-01-22
Schreibe einen Kommentar