Grand Central Dispatch (GCD) 是一个非常好的选择,如果你想要在编程中实现某些功能,你可以使用 DispatchQueue 和 DispatchGroup,具体实现如下:
Swift 3:
func doEverything(completion: @escaping () -> ()) {
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
let group = DispatchGroup()
group.enter()
queue.async (group: group) {
print("do alpha")
group.leave()
}
group.enter()
queue.async (group: group) {
print("do beta")
group.leave()
}
group.notify(queue: DispatchQueue.main) {
completion()
}
}
或者,您可以按照以下方式实现(我认为这种方式更易读):
func doEverything(completion: @escaping () -> ()) {
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
let group = DispatchGroup()
queue.async (group: group) {
print("do alpha")
}
queue.async (group: group) {
print("do beta")
}
group.notify(queue: DispatchQueue.main) {
completion()
}
}
请注意,我从completion
闭包中删除了success
标志。
在这种情况下,“do beta”(第二个queue.async
的执行)直到“do alpha”(第一个queue.async
的执行)完成后才会执行,这是因为queue
目标是.main
。如果您想让两个queue.async
并行工作,则无需创建额外的队列,同一个队列应该可以完成工作,方法是用以下代码替换:
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent, target: .main)
使用:
let queue = DispatchQueue(label: "reverseDomain", attributes: .concurrent)
现在,系统将控制
queue.async
任务同时运行的方式(显然,在这两个任务完成后,
group.notify
将被执行)。
希望这有所帮助。
dispatch_group_t
: https://dev59.com/0mct5IYBdhLWcg3wqfP9 - Larme