Chciałbym, aby pętla for in wysyłała kilka żądań sieciowych do firebase, a następnie przekazywała dane do nowego kontrolera widoku po zakończeniu wykonywania metody. Oto mój kod:
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
Mam kilka obaw. Po pierwsze, jak mam czekać, aż pętla for zostanie zakończona i wszystkie żądania sieciowe zostaną zakończone? Nie mogę zmodyfikować funkcji observSingleEventOfType, jest ona częścią zestawu SDK Firebase. Ponadto, czy utworzę jakiś rodzaj wyścigu, próbując uzyskać dostęp do tablicy dat z różnych iteracji pętli for (mam nadzieję, że ma to sens)? Czytałem o GCD i NSOperation, ale jestem trochę zagubiony, ponieważ jest to pierwsza aplikacja, którą zbudowałem.
Uwaga: Tablica lokalizacji to tablica zawierająca klucze, do których potrzebuję dostępu w firebase. Ponadto ważne jest, aby żądania sieciowe były odpalane asynchronicznie. Chcę tylko poczekać, aż WSZYSTKIE asynchroniczne żądania zakończą się, zanim przekażę dateArray do następnego kontrolera widoku.
datesArray
użycia innego klucza.Xcode 8.3.1 - Swift 3
Oto akceptowana odpowiedź Paulvów, przekonwertowana na Swift 3:
źródło
Swift 3 lub 4
Jeśli nie dbają o zamówieniach , korzystanie @ paulvs męska odpowiedź , to działa doskonale.
inaczej na wszelki wypadek, gdyby ktoś chciał uzyskać wynik w kolejności zamiast odpalać je jednocześnie, oto kod.
źródło
dispatchSemaphore.signal()
przed, czy po opuszczeniudispatchGroup
? Można by pomyśleć, że najlepiej odblokować semafor tak późno, jak to możliwe, ale nie jestem pewien, czy i jak opuszczenie grupy to przeszkadza. Przetestowałem oba zamówienia i nie miało to znaczenia.Detale
Rozwiązanie
Stosowanie
Pełna próbka
źródło
W tym celu będziesz musiał użyć semaforów.
źródło
Swift 3: W ten sposób możesz również użyć semaforów. Jest to bardzo pomocne, poza tym możesz dokładnie śledzić, kiedy i jakie procesy są zakończone. Zostało to wyodrębnione z mojego kodu:
źródło
Możemy to zrobić z rekurencją. Uzyskaj pomysł z poniższego kodu:
źródło
Grupa wysyłkowa jest dobra, ale kolejność wysyłanych zapytań jest losowa.
W przypadku mojego projektu każda prośba o uruchomienie to właściwa kolejność. Jeśli to mogłoby komuś pomóc:
Połączenie :
Wynik:
Zobacz więcej informacji: Gist
źródło