作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
我正在尝试使打印的顺序合理化。这是我的想法:
等待
期望得到满足。此等待使当前线程(即主线程)休眠 2 秒。那么,即使我们还没有从主线程分派(dispatch)出来,究竟是如何等待成功的呢?我的意思是“等待之后”还没有打印出来!所以我们必须仍然在主线程上。因此,“ block 执行”永远不可能发生。
我的解释有什么问题吗?我猜我一定是 wait
的实现方式
最佳答案
XCTestCase
的 wait(for:timeout:)
与您可能熟悉的 GCD 组/信号量 wait
函数不同.
当您调用 wait(for:timeout:)
时,就像 GCD wait
调用一样,它不会返回,直到超时到期或期望得到解决。但是,在 XCTestCase
的情况下,与 GCD 变体不同,在 wait(for:timeout:)
内部,它是循环的,重复调用 run(mode:before:)
直到期望得到解决或超时。这意味着尽管 testX
在 wait
满足之前不会继续,但对 run(mode:before:)
的调用将允许运行循环继续处理事件(包括分派(dispatch)到该队列的任何内容,包括完成处理程序关闭)。因此没有死锁。
可能不用说,这是 XCTestCase
的一个特性,但不是您自己的代码中可以使用的模式。
无论如何,有关运行循环如何工作的更多信息,请参阅 Threading Programming Guide: Run Loops .
关于ios - 等待要在下一次分派(dispatch)时执行的 block 如何成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741819/
我是一名优秀的程序员,十分优秀!