我可以不在循环中使用调度组吗?

时间:2017-01-26 08:57:15

标签: swift asynchronous swift3 grand-central-dispatch

假设我在调用某个函数之前有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声明放在哪里?

1 个答案:

答案 0 :(得分:3)

在这种情况下,您的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
}