12

我正在使用一个使用 SPM 创建的非常简单的 swift 项目,其中包括 Alamofire。

main.swift:

import Alamofire

Alamofire.request("https://google.com").responseString(queue: queue) { response in
            print("\(response.result.isSuccess)")
}

如果我不使用锁,则永远不会执行闭包。有没有办法指示在退出之前等待所有线程或特定线程?

我知道这可以使用 Playgrounds 轻松实现。

4

2 回答 2

35

等待异步任务的最简单方法是使用信号量:

let semaphore = DispatchSemaphore(value: 0)

doSomethingAsync {
    semaphore.signal()
}

semaphore.wait()

// your code will not get here until the async task completes

或者,如果您正在等待多个任务,您可以使用调度组:

let group = DispatchGroup()

group.enter()
doAsyncTask1 {
    group.leave()
}

group.enter()
doAsyncTask2 {
    group.leave()
}

group.wait()

// You won't get here until all your tasks are done
于 2017-10-31T17:52:27.617 回答
6

对于斯威夫特 3

let group = DispatchGroup()
group.enter()
DispatchQueue.global(qos: .userInitiated).async {
    // Do work asyncly and call group.leave() after you are done
    group.leave()
}
group.notify(queue: .main, execute: {
    // This will be called when block ends             
})

当您需要在完成某些任务后执行某些代码时,此代码将很有帮助。

请添加有关您的问题的详细信息,然后我可以为您提供更多帮助。

于 2017-10-31T18:13:05.110 回答