Aguarde até que o loop for rápido com solicitações de rede assíncronas termine a execução

Eu gostaria que um loop for in enviasse várias solicitações de rede para o firebase e passasse os dados para um novo controlador de exibição assim que o método concluir a execução. Aqui está o meu código:

    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 

Eu tenho algumas preocupações. Primeiro, como espero até que o loop for seja concluído e todas as solicitações de rede sejam concluídas? Não consigo modificar a função observeSingleEventOfType, ela faz parte do SDK da base de firmas. Além disso, vou criar algum tipo de condição de corrida tentando acessar o dateArray de diferentes iterações do loop for (esperança que faça sentido)? Eu tenho lido sobre GCD e NSOperation, mas estou um pouco perdido, pois este é o primeiro aplicativo que eu criei.

Nota: A matriz de locais é uma matriz que contém as chaves que eu preciso acessar no firebase. Além disso, é importante que as solicitações de rede sejam disparadas de forma assíncrona. Eu só quero esperar até que TODAS as solicitações assíncronas sejam concluídas antes de passar o dateArray para o próximo controlador de exibição.

questionAnswers(7)

yourAnswerToTheQuestion