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
实施的
该wait(for:timeout:)
的XCTestCase
不是像GCD组/旗语wait
与你很可能熟悉的功能。
当您调用 时wait(for:timeout:)
,就像 GCDwait
调用一样,它不会返回,直到超时到期或期望得到解决。但是,在XCTestCase
与 GCD 变体不同的情况下,在内部wait(for:timeout:)
,它是循环的,反复调用,run(mode:before:)
直到期望得到解决或超时。这意味着虽然testX
在wait
满足之前不会继续进行,但对 的调用run(mode:before:)
将允许运行循环继续处理事件(包括调度到该队列的任何内容,包括完成处理程序关闭)。因此没有死锁。
可能不用说,这是一个特性,XCTestCase
但不是在您自己的代码中使用的模式。
无论如何,有关运行循环如何工作的更多信息,请参阅线程编程指南:运行循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句