我可以使用 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.
显然,如果我处理不同的队列,我只能使用 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.