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 esse é o primeiro aplicativo que eu criei.
Nota: A matriz de locais é uma matriz que contém as chaves que preciso acessar no firebase. Além disso, é importante que as solicitações de rede sejam acionadas 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.
datesArray
uso de uma chave diferente.Xcode 8.3.1 - Swift 3
Esta é a resposta aceita de paulvs, convertida em Swift 3:
fonte
Swift 3 ou 4
Se você não se importa com pedidos , use a resposta da @ paulvs , ela funciona perfeitamente.
caso contrário, se alguém quiser obter o resultado em ordem, em vez de acioná-lo simultaneamente, aqui está o código.
fonte
dispatchSemaphore.signal()
antes ou depois de sair dodispatchGroup
? Você acha que é melhor desbloquear o semáforo o mais tarde possível, mas não tenho certeza se e como a saída do grupo interfere nisso. Testei os dois pedidos e não pareceu fazer diferença.Detalhes
Solução
Uso
Amostra completa
fonte
Você precisará usar semáforos para esse fim.
fonte
Swift 3: Você também pode usar semáforos dessa maneira. Isso resulta muito útil, além de você poder acompanhar exatamente quando e quais processos foram concluídos. Isso foi extraído do meu código:
fonte
Podemos fazer isso com recursão. Obtenha uma ideia do código abaixo:
fonte
O grupo de distribuição é bom, mas a ordem dos pedidos enviados é aleatória.
No meu caso de projeto, cada solicitação necessária para o lançamento é a ordem certa. Se isso puder ajudar alguém:
Ligar :
Resultado:
Veja mais informações: Gist
fonte