Описание : у меня есть функция, в которой мне нужно выполнить блок A, выполнить блок B, затем, когда оба будут выполнены, будет выполнен блок C.Я использую DispatchGroup()
для этого.Но как dispatchGroup.leave()
в блоке A, так и в блоке B находятся внутри замыканий completeHandler, которые не принимают аргументов, но захватывают dispatchGroup
.То же самое для dispatchGroup.notify(...)
, блок кода execute
, который является блоком C, нуждается в переменных из окружающей области, но блок не принимает аргументов.
Вопрос : блок A,B, C все внутри одного гигантского функционала, я хочу реорганизовать его в более мелкие, в такой ситуации как я могу это сделать?
Упрощенный код
private func copy(// bla bla bla)
{
let dispatchGroup = DispatchGroup()
// code, make variables that will be needed in block A, B, C
dispatchGroup.enter()
_ = item.dragItem.itemProvider.loadObject(ofClass: UIImage.self) { (provider, error) in
// block A
dispatchGroup.leave()
}
dispatchGroup.enter()
_ = item.dragItem.itemProvider.loadObject(ofClass: URL.self) { (provider, error) in
// block B
dispatchGroup.leave()
}
dispatchGroup.notify(queue: .main) {
// block C
}
}