Me gustaría un for in loop para enviar un montón de solicitudes de red a firebase, luego pasar los datos a un nuevo controlador de vista una vez que el método termine de ejecutarse. Aquí está mi 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
Tengo un par de preocupaciones Primero, ¿cómo espero hasta que finalice el ciclo for y se completen todas las solicitudes de red? No puedo modificar la función observeSingleEventOfType, es parte del SDK de Firebase. Además, ¿crearé algún tipo de condición de carrera al intentar acceder a la matriz de fechas desde diferentes iteraciones del ciclo for (espero que tenga sentido)? He estado leyendo sobre GCD y NSOperation pero estoy un poco perdido ya que esta es la primera aplicación que he creado.
Nota: La matriz de ubicaciones es una matriz que contiene las claves a las que necesito acceder en firebase. Además, es importante que las solicitudes de red se disparen de forma asincrónica. Solo quiero esperar hasta que se completen TODAS las solicitudes asincrónicas antes de pasar el arreglo de fechas al siguiente controlador de vista.
datesArray
uso de una clave diferente.Xcode 8.3.1 - Swift 3
Esta es la respuesta aceptada de paulvs, convertida a Swift 3:
fuente
Swift 3 o 4
Si no te importan las órdenes , usa la respuesta de @paulvs , funciona perfectamente.
de lo contrario, en caso de que alguien quiera ordenar el resultado en lugar de dispararlo al mismo tiempo, aquí está el código.
fuente
dispatchSemaphore.signal()
antes o después de dejar eldispatchGroup
? Se podría pensar que es mejor desbloquear el semáforo lo más tarde posible, pero no estoy seguro de si dejar el grupo interfiere con eso. Probé ambas órdenes y no pareció hacer la diferencia.Detalles
Solución
Uso
Muestra completa
fuente
Necesitará usar semáforos para este propósito.
fuente
Swift 3: también puede usar semáforos de esta manera. Resulta muy útil, además de que puede realizar un seguimiento exacto de cuándo y qué procesos se completan. Esto ha sido extraído de mi código:
fuente
Podemos hacer esto con recursividad. Obtenga una idea del siguiente código:
fuente
El grupo de despacho es bueno pero el orden de las solicitudes enviadas es aleatorio.
En el caso de mi proyecto, cada solicitud que se necesita para iniciar es el orden correcto. Si esto podría ayudar a alguien:
Llamada :
Resultado:
Ver para más información: Gist
fuente