我可以使用 DispatchSemaphore 来控制主队列上的线程吗?

Can I use a DispatchSemaphore to control a thread on main queue?

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

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

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

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

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

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

what if I want to run async code on the same queue (in this case the main queue).

然后使用 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.

If I call async, don't I run that code on a different thread?

不,您需要了解一般的线程 运行 循环和 iOS's Main Event Loop specifically.