Ich möchte, dass eine for-in-Schleife eine Reihe von Netzwerkanforderungen an firebase sendet und die Daten dann an einen neuen View-Controller weiterleitet, sobald die Ausführung der Methode abgeschlossen ist. Hier ist mein Code:
var datesArray = [String: AnyObject]()
for key in locationsArray {
let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)")
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
datesArray["\(key.0)"] = snapshot.value
})
}
// Segue to new view controller here and pass datesArray once it is complete
Ich habe ein paar Bedenken. Wie warte ich zunächst, bis die for-Schleife abgeschlossen ist und alle Netzwerkanforderungen abgeschlossen sind? Ich kann die Funktion compareSingleEventOfType nicht ändern, sie ist Teil des Firebase-SDK. Werde ich auch eine Art Race-Bedingung erstellen, indem ich versuche, aus verschiedenen Iterationen der for-Schleife auf das Datumsarray zuzugreifen (hoffe, das macht Sinn)? Ich habe über GCD und NSOperation gelesen, bin aber etwas verloren, da dies die erste App ist, die ich erstellt habe.
Hinweis: Das Locations-Array ist ein Array, das die Schlüssel enthält, auf die ich in Firebase zugreifen muss. Außerdem ist es wichtig, dass die Netzwerkanforderungen asynchron ausgelöst werden. Ich möchte nur warten, bis ALLE asynchronen Anforderungen abgeschlossen sind, bevor ich das Datumsarray an den nächsten Ansichtscontroller übergebe.
datesArray
Verwendung eines anderen Schlüssels Werte hinzufügen .Xcode 8.3.1 - Swift 3
Dies ist die akzeptierte Antwort von Paulvs, konvertiert zu Swift 3:
quelle
Swift 3 oder 4
Wenn Sie sich nicht für Bestellungen interessieren, verwenden Sie die Antwort von @ paulvs , es funktioniert perfekt.
sonst nur für den Fall, dass jemand das Ergebnis in der richtigen Reihenfolge erhalten möchte, anstatt es gleichzeitig abzufeuern, hier ist der Code.
quelle
dispatchSemaphore.signal()
vor oder nach dem Verlassen der tundispatchGroup
? Sie würden denken, dass es am besten ist, das Semaphor so spät wie möglich zu entsperren, aber ich bin mir nicht sicher, ob und wie das Verlassen der Gruppe dies stört. Ich habe beide Bestellungen getestet und es schien keinen Unterschied zu machen.Einzelheiten
Lösung
Verwendung
Vollständige Probe
quelle
Zu diesem Zweck müssen Sie Semaphoren verwenden.
quelle
Swift 3: Auf diese Weise können Sie auch Semaphoren verwenden. Es ist sehr hilfreich, außerdem können Sie genau verfolgen, wann und welche Prozesse abgeschlossen sind. Dies wurde aus meinem Code extrahiert:
quelle
Wir können dies mit Rekursion tun. Machen Sie sich ein Bild von dem folgenden Code:
quelle
Die Versandgruppe ist gut, aber die Reihenfolge der gesendeten Anfragen ist zufällig.
In meinem Projektfall ist jede Anforderung, die gestartet werden muss, die richtige Reihenfolge. Wenn dies jemandem helfen könnte:
Anruf :
Ergebnis:
Weitere Informationen finden Sie unter: Gist
quelle