2017-01-26 31 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() 
    }) 

不过,我对你怎么做到这一点困惑,如果这些任务都是在同一个函数但不必与海誓山盟,就像推动3个不同的值到你的数据库。事情是这样的:

updateDatabase() { 
     var dispatchGroup = DispatchGroup() 

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

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

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

你会在哪里把leaveenter声明在这种情况下,因为这?

回答

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 
} 
相关问题