Swift / Как использовать dispatch_group с несколькими вызываемыми веб-сервисами?
я используюdispatch_group
вызывать функции запроса Firebase и получать уведомление после завершения запроса, чтобы иметь возможность работать с результатом. В этом сценарии я просто поместил заявление для печати.
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()
})
}
Этот код работает нормально.Проблема в что во время выполнения данные будут добавлены в базу данных Firebase. Вот почему я должен использоватьobserveEventType
вместоobserveSingleEventOfType
.
Это означает, что во время выполнения есть наблюдатель, и в случае, если данные были добавлены в базу данных, блок внутриmyFirebaseFunction
будет вызван снова.
Как только это происходит, приложение вылетает, потому чтоdispatch_group_leave(group)
был вызван безdispatch_group_enter(group)
, Пока я понял это правильно.
dispatch_group_enter(group)
myFirebaseFunction() {
dispatch_group_leave(group) // crash here
}
Если я изменю это наobserveSingleEventOfType
, не происходит сбоев, но новые добавленные данные в Firebase не будут наблюдаться.
Какую практику лучше всего использоватьdispatch_group
с несколькими запусками веб-сервисов? Или что мне нужно сделать, чтобы исправить мою проблему? Помощь очень ценится.
PS В настоящее время я использую Swift 2.3, но планируется обновление до Swift 3, поэтому было бы очень здорово получить ответ, способный на оба.