Swift / ¿Cómo usar dispatch_group con múltiples servicios web llamados?
estoy usandodispatch_group
llamar a las funciones solicitantes de Firebase y recibir una notificación una vez que se complete la solicitud para poder trabajar con el resultado en ese momento. En este escenario, acabo de poner una declaración impresa.
func loadStuff() {
dispatch_group_enter(group)
myFirebaseFunction() {
dispatch_group_leave(group)
}
dispatch_group_notify(group, dispatch_get_main_queue()) {
print("done")
}
}
func myFirebaseFunction(completionHandler: () -> ()) {
let usersRef = firebase.child("likes")
usersRef.observeEventType(.Value, withBlock: { snapshot in
if snapshot.exists() {
let sorted = (snapshot.value!.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptor(key: "date",ascending: false)])
for item in sorted {
dict.append(item as! NSDictionary)
}
}
completionHandler()
})
}
Este código está funcionando bien.El problema es que, durante el tiempo de ejecución, los datos se agregarán a la base de datos de Firebase. Por eso tengo que usarobserveEventType
en lugar deobserveSingleEventOfType
.
Esto significa que hay un observador durante el tiempo de ejecución y, en caso de que se hayan agregado datos a la base de datos, el bloque dentro demyFirebaseFunction
Será llamado de nuevo.
Una vez que esto sucede, la aplicación se bloquea porquedispatch_group_leave(group)
ha sido llamado sindispatch_group_enter(group)
. Mientras tenga esto bien.
dispatch_group_enter(group)
myFirebaseFunction() {
dispatch_group_leave(group) // crash here
}
Si lo cambio aobserveSingleEventOfType
, no se produce un bloqueo, pero no se observarán los nuevos Datos agregados a Firebase.
¿Cuál es la mejor práctica para usar?dispatch_group
con múltiples servicios web? ¿O qué debo hacer para solucionar mi problema? La ayuda es muy apreciada.
PD Actualmente estoy usando Swift 2.3, pero se planea una actualización a Swift 3, por lo que sería muy sorprendente recibir una respuesta capaz de ambos.