2017-01-26 8 views
0

Скажем, у меня есть 3 разных асинхронных задачи, которые я хочу выполнить, прежде чем вызывать какую-то функцию. Я знаю, используя диспетчерские группы, чтобы сделать такую ​​вещь, если эти задачи были в цикле,Могу ли я использовать группу отправки не в цикле?

var dispatchGroup = DispatchGroup() 

    for task in tasks { 
     dispatchGroup.enter() 

     DoSomeTask { (error, ref) -> Void in 
      dispatchGroup.leave() 
     } 
    } 

    dispatchGroup.notify(queue: DispatchQueue.main, execute: { 
     DoSomeFunction() 
    }) 

Однако, я запутался о том, как вы могли бы сделать это, если эти задачи были все в одной и той же функции но не нужно было делать с eachother, например, нажатием 3 разных значений в вашу базу данных. Что-то вроде этого:

updateDatabase() { 
     var dispatchGroup = DispatchGroup() 

     DoTask1 { (error, ref) -> Void in   
     } 

     DoTask2 { (error, ref) -> Void in   
     } 

     DoTask3 { (error, ref) -> Void in   
     } 
    } 

Где бы вы положили заявление leave и enter в таком случае, как это?

ответ

2

В этом случае ваша 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 
}