如何等待将在下一次分派时执行的块成功?

蜜糖
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

我正在努力使印刷品的顺序合理化。这就是我的想法:

  1. 测试在主线程上运行
  2. 它从主线程分派一个块,但由于分派发生在主线程,所以块执行必须等到当前块被执行
  3. 打印“等待之前”
  4. 我们wait希望得到满足。此等待使当前线程(即主线程)休眠 2 秒。那么,即使我们还没有从主线程中分派出去,等待成功到底是怎么回事。我的意思是“等待之后”还没有打印出来!所以我们必须仍然在主线程上。因此,“块执行”永远没有机会发生。

我的解释有什么问题?我猜我一定是如何wait实施的

wait(for:timeout:)XCTestCase不是像GCD组/旗语wait与你很可能熟悉的功能。

当您调用 时wait(for:timeout:),就像 GCDwait调用一样,它不会返回,直到超时到期或期望得到解决。但是,在XCTestCase与 GCD 变体不同的情况下,在内部wait(for:timeout:),它是循环的,反复调用,run(mode:before:)直到期望得到解决或超时。这意味着虽然testXwait满足之前不会继续进行,但对 的调用run(mode:before:)将允许运行循环继续处理事件(包括调度到该队列的任何内容,包括完成处理程序关闭)。因此没有死锁。

可能不用说,这是一个特性,XCTestCase但不是在您自己的代码中使用的模式。

无论如何,有关运行循环如何工作的更多信息,请参阅线程编程指南:运行循环

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何等待“ for循环下一次迭代”,直到获得FileReader.onload结果

Javascript / jQuery:在第一次AJAX调用成功时开始“闪烁”,在下一次停止

$ .get在下一次执行代码之前不起作用

在JS / JQUery中执行下一次循环迭代之前,如何使代码等待x秒?

仅在下一次击键时切换键盘布局

在下一次按下时反应本机焦点文本输入

R函数范围:希望在下一次迭代时看到返回值

在下一次获取数据时的coustom钩子呈现丢失的数据

Kafka:在下一次重新平衡时无法分配增加的分区

Foreach 应该等待下一次迭代,直到 wait 在节点中执行

如何在下一次迭代之前在JavaScript循环中添加延迟?

让摩卡咖啡等待下一次测试

如何使循环等待db promise完成,然后再继续下一次迭代?

如何在for循环中的下一次迭代之前等待承诺解决

如何在下一次登录时将上一个登录Shell保留为当前Shell?

为什么在进行循环时,在下一次迭代时始终将其重置为0?

如何将类变量从程序的第一次执行传递到下一次执行?

在进行下一次迭代之前,如何使我的for循环完全执行任务?

等待循环中的异步功能完成执行,然后再进行下一次迭代

如何将值存储到此dict中,以便在下一次迭代中起作用?

如何使用模型的预训练权重在下一次迭代中初始化权重?

在日志文件中找到重复的ID时,批处理文件执行操作,而在查找新的重复ID而不是前一个重复ID时,在下一次运行中执行操作

循环第一次执行与下一次执行之间的延迟

压缩两个迭代时如何获得下一次迭代

在while循环中单击按钮时,如何进行下一次迭代?

设置backoffCoefficient时,如何为持久功能计算下一次重试时间?

如何跳过下一次迭代?

如何检查选民已经投票一次并且在下一次选举之前不能再次投票?

js onkeypress 在下一次输入之前不起作用