Я использую 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 запланировано, поэтому было бы очень здорово получить ответ, способный для обоих.