Могу ли я использовать группу отправки не в цикле?

Скажем, у меня есть 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
}
Другие вопросы по тегам