6

显然,如果我处理不同的队列,我只能使用 DispatchSemaphore。但是如果我想在同一个队列(在本例中是主队列)上运行异步代码怎么办。

let s = DispatchSemaphore(value : 0)
DispatchQueue.main.async {
   s.signal()
}
s.wait()

这个片段不起作用,因为异步代码也在等待,因为信号量阻塞了主队列。我可以用信号量做到这一点吗?还是我需要在不同的队列上运行异步代码?

附言。我知道我可以在这个片段中使用同步,而不是异步和信号量。但这只是重现异步调用的示例代码。

4

2 回答 2

3

所有这些都在主线程上,所以semaphore.signal()永远不会被调用,因为线程将停止semaphore.wait()并且不会继续。

如果您尝试运行一些异步代码并让主线程等待它,请在不同的队列上运行该代码并让它在完成时发出信号量信号,从而允许主线程继续。

于 2019-08-28T15:50:34.893 回答
-1

如果我想在同一个队列(在这种情况下是主队列)上运行异步代码怎么办。

然后DispatchGroup改用。那不是DispatchSemaphore目的。

在操场上运行此代码。

import Foundation

let d = DispatchGroup()
var v:Int = 1
d.enter()
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    v = 7
    d.leave()
}

d.notify(queue: DispatchQueue.main) {
    print("v = \(v)")
}

输出将是v = 7. 如果您注释掉d.enter()d.leave()那么输出将是v = 1.

如果我调用异步,我不是在不同的线程上运行该代码吗?

不,您需要了解一般的线程运行循环和专门了解 iOS 的主事件循环

于 2019-09-03T20:46:46.173 回答