Я хотел бы, чтобы цикл in отправлял кучу сетевых запросов в firebase, а затем передавал данные новому контроллеру представления после завершения метода. Вот мой код:
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
У меня есть пара проблем. Во-первых, как мне дождаться завершения цикла for и завершения всех сетевых запросов? Я не могу изменить функцию наблюдаем единыйEventOfType, это часть SDK Firebase. Кроме того, я создам какое-то условие гонки, пытаясь получить доступ к dateArray из разных итераций цикла for (надеюсь, это имеет смысл)? Я читал о GCD и NSOperation, но я немного растерялся, так как это первое приложение, которое я создал.
Примечание: массив Locations - это массив, содержащий ключи, которые мне нужны для доступа в firebase. Также важно, чтобы сетевые запросы запускались асинхронно. Я просто хочу подождать, пока ВСЕ асинхронные запросы завершатся, прежде чем я передам dateArray следующему контроллеру представления.
источник
datesArray
использованию другого ключа.Xcode 8.3.1 - Swift 3
Это принятый ответ Паульва, преобразованный в Swift 3:
источник
Свифт 3 или 4
Если вас не интересуют заказы , используйте ответ @ paulvs , он работает отлично.
В противном случае, если кто-то хочет получить результат по порядку, а не запускать их одновременно, вот код.
источник
dispatchSemaphore.signal()
до или после уходаdispatchGroup
? Вы могли бы подумать, что лучше разблокировать семафор как можно позже, но я не уверен, мешает ли это покинуть группу. Я проверил оба заказа, и это, похоже, не имело значения.подробности
Решение
использование
Полный образец
источник
Вам нужно будет использовать семафоры для этой цели.
источник
Swift 3: Вы также можете использовать семафоры на этом пути. Это очень полезно, кроме того, вы можете точно отслеживать, когда и какие процессы завершены. Это было извлечено из моего кода:
источник
Мы можем сделать это с помощью рекурсии. Получить идею из кода ниже:
источник
Группа рассылки хороша, но порядок отправленных запросов случайный.
В моем случае проекта, каждый запрос должен быть запущен, это правильный порядок. Если бы это могло помочь кому-то:
Вызов :
Результат:
Смотрите больше информации: Gist
источник