Swift / Como usar o dispatch_group com vários serviços da web chamados?
estou usandodispatch_group
para chamar as funções de solicitação do Firebase e ser notificado assim que a solicitação for concluída para poder trabalhar com o resultado. Nesse cenário, acabei de colocar uma declaração de impressão.
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 bem.O problema é que, durante o tempo de execução, os dados serão adicionados ao banco de dados Firebase. É por isso que eu tenho que usarobserveEventType
ao invés deobserveSingleEventOfType
.
Isso significa que há um observador durante o tempo de execução e, caso dados tenham sido adicionados ao banco de dados, o bloco dentromyFirebaseFunction
será chamado novamente.
Quando isso acontece, o aplicativo falha porquedispatch_group_leave(group)
foi chamado semdispatch_group_enter(group)
. Contanto que eu entendi direito.
dispatch_group_enter(group)
myFirebaseFunction() {
dispatch_group_leave(group) // crash here
}
Se eu mudar paraobserveSingleEventOfType
, nenhuma falha ocorre, mas novos dados adicionados ao Firebase não serão observados.
Qual é a melhor prática a ser usadadispatch_group
com vários serviços Web executados? Ou o que preciso fazer para corrigir meu problema? A ajuda é muito apreciada.
PS Atualmente, estou usando o Swift 2.3, mas está planejada uma atualização para o Swift 3, por isso seria incrível receber uma resposta capaz para ambos.