我有这段代码:
func doSomethingFromJSON1() {
print("1")
}
func doSomethingFromJSON2() {
print("2")
}
func downloadImage() {
print("3")
}
func waitingForNext() {
print("4 - waiting")
}
func lastThread(){
print("Last THREAD")
}
func finishFunction(){
print("Finish")
}
func doItAll() {
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
DispatchQueue.global().async {
self.doSomethingFromJSON1()
dispatchGroup.leave()
}
dispatchGroup.enter()
DispatchQueue.global().async {
self.doSomethingFromJSON2()
dispatchGroup.leave()
}
dispatchGroup.enter()
DispatchQueue.global().async {
self.downloadImage()
dispatchGroup.leave()
}
dispatchGroup.enter()
DispatchQueue.global().async {
self.waitingForNext()
dispatchGroup.leave()
}
dispatchGroup.notify(queue: .global()) {
self.finishFunction()
}
}
我希望线程“waitingForNext”等到执行“lastThread”线程,然后才启动它。
完成所有线程后,我想启动函数功能完成(现在就是这样)。
你怎么能这样做?
答案 0 :(得分:0)
根据苹果官方文档:
DispatchSemaphore提供了一个有效的实现 传统的计数信号量,可用于控制访问 跨多个执行上下文的资源。
通过调用signal()方法增加信号量计数,并且 通过调用wait()方法或其中一个来减少信号量计数 指定超时的变体。
按照以下代码更新您的代码。这意味着在完成上一个任务时执行下一个任务。
func doItAll() {
let semaPhore = DispatchSemaphore(value: 1)
semaPhore.wait()
DispatchQueue.global().async {
doSomethingFromJSON1()
semaPhore.signal()
}
semaPhore.wait()
DispatchQueue.global().async {
doSomethingFromJSON2()
semaPhore.signal()
}
semaPhore.wait()
DispatchQueue.global().async {
downloadImage()
semaPhore.signal()
}
semaPhore.wait()
DispatchQueue.global().async {
waitingForNext()
semaPhore.signal()
}
}