Überprüfung auf mehrere asynchrone Antworten von Alamofire und Swift

Ich schreibe eine Anwendung, die von Daten von verschiedenen Standorten / Diensten abhängt, und führe Berechnungen aus, die auf Daten aus diesen verschiedenen Quellen basieren, um ein Endprodukt zu erstellen.

Ich habe eine Beispielklasse mit zwei Funktionen darunter geschrieben, die Daten aus den beiden Quellen sammelt. Ich habe mich dafür entschieden, die Funktionen unterschiedlich zu gestalten, da wir manchmal abhängig von der Quelle unterschiedliche Authentifizierungsmethoden anwenden, aber in diesem Beispiel habe ich sie nur auf ihre einfachste Form reduziert. Beide Funktionen verwenden Alamofire, um die Anforderungen auszulösen und zu verarbeiten.

Ich habe dann eine Initialisierungsfunktion, die besagt, dass, wenn wir erfolgreich Daten aus beiden Quellen gesammelt haben, eine andere NIB-Datei geladen wird. Andernfalls warten Sie bis zu Sekunden. Wenn keine Antwort zurückgegeben wurde, laden Sie eine Serverfehler-NIB-Datei.

Ich habe versucht, dieses Beispiel so einfach wie möglich zu gestalten. Im Wesentlichen. Dies ist die Art von Logik, der ich folgen möchte. Leider scheint dies derzeit in der aktuellen Implementierung nicht zu funktionieren.

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 den zweiten Verschluss innerhalb des ersten innerhalb der Init-Funktion platzieren könnte, aber ich glaube nicht, dass dies eine bewährte Methode ist, und ich ziehe tatsächlich aus mehr als 2 Quellen, so dass der Verschluss n Verschlüsse tief sein würde.

Jede Hilfe, um herauszufinden, wie Sie am besten überprüfen können, ob mehrere Datenquellen eine gültige Antwort geliefert haben, und deren angemessene Behandlung, wäre sehr willkommen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage