import XCTest
@testable import TestWait
class TestWait: XCTestCase {
func testX() {
guard Thread.isMainThread else {
fatalError()
}
let exp = expectation(description: "x")
DispatchQueue.main.async {
print("block execution")
exp.fulfill()
}
print("before wait")
wait(for: [exp], timeout: 2)
print("after wait")
}
}
输出:
before wait
block execution
after wait
我正在尝试合理化打印顺序。这就是我的想法:
wait
期望得到满足。该等待使当前线程(即主线程)休眠2秒钟。因此,即使我们仍未从主线程中分派出去,等待的方式还是成功了。我的意思是“等待后”尚未打印!因此,我们必须仍然在主线程上。因此,“块执行”从来没有机会发生。 我的解释怎么了?我猜想我必须与wait
的实现方式有关
导入XCTest @testable导入TestWait类TestWait:XCTestCase {func testX(){保护Thread.isMainThread其他{fatalError()} let exp =期望(...
wait
功能最有可能在内部利用NSRunLoop
。运行循环不会像sleep
函数那样阻塞主线程。尽管函数testX
不在运行循环上执行,但它仍接受在线程中调度的事件并分派要执行的事件如有疑问,请查看源代码!
_ = runLoop.run(mode: .default, before: Date(timeIntervalSinceNow: timeIntervalToRun))
您不应该以
threads
来考虑等待,而是以queues>]来考虑等待。通过RunLoop.current.run()
,您基本上可以告诉当前代码开始执行队列中的其他项目。