Могу ли я использовать группу отправки не в цикле?
Скажем, у меня есть 3 разные асинхронные задачи, которые я хочу выполнить перед вызовом какой-либо функции. Я знаю об использовании групп рассылки, чтобы делать такие вещи, если эти задачи были в цикле,
var dispatchGroup = DispatchGroup()
for task in tasks {
dispatchGroup.enter()
DoSomeTask { (error, ref) -> Void in
dispatchGroup.leave()
}
}
dispatchGroup.notify(queue: DispatchQueue.main, execute: {
DoSomeFunction()
})
Тем не менее, я запутался в том, как бы вы сделали это, если бы все эти задачи были в одной и той же функции, но не имели отношения друг к другу, как, например, отправка 3 разных значений в вашу базу данных. Что-то вроде этого:
updateDatabase() {
var dispatchGroup = DispatchGroup()
DoTask1 { (error, ref) -> Void in
}
DoTask2 { (error, ref) -> Void in
}
DoTask3 { (error, ref) -> Void in
}
}
Где бы вы положили leave
а также enter
Скажите в таком случае как это?
1 ответ
Решение
В этом случае ваш updateDatabase()
Функция нуждается в блоке завершения, который вы вызываете после завершения всех обновлений:
updateDatabase(onSccess completion:() -> Void) {
var dispatchGroup = DispatchGroup()
dispatchGroup.enter()
DoTask1 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.enter()
DoTask2 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.enter()
DoTask3 { (error, ref) -> Void in
dispatchGroup.leave()
}
dispatchGroup.notify(queue: DispatchQueue.main) {
completion()
}
}
Вы, чем назвать это так:
updateDatabase() {
//do somthing after updating
}