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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besser als die looping-Verfahrens, das würde den thread blockiert, könnten Sie Versand-Gruppe zu verfolgen, wenn die Anfragen wurden erledigt. Also "enter" der Gruppe vor der Emission jeder der fordert, "verlassen" der Gruppe, wenn die Anfrage erledigt ist, und die Einrichtung eines "notify" - block/Verschluss versehen, der aufgerufen wird, wenn alle Aufgaben fertig sind.
Beispielsweise in Swift 3:
Oder im Swift 2:
Der andere Ansatz ist, um wickeln Sie diese Anfragen innerhalb eines asynchronen
NSOperation
Unterklasse (was Sie stornierbar, so dass Sie Kontrolle über die Bestimmung der Grad der Parallelität, etc.), aber das ist komplizierter, so möchten Sie vielleicht beginnen mit der Absendung Gruppen, wie oben gezeigt.