gpt4 book ai didi

ios - 等待要在下一次分派(dispatch)时执行的 block 如何成功?

转载 作者:行者123 更新时间:2023-11-28 20:48:31 25 4
gpt4 key购买 nike

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. 它从主线程分派(dispatch)一个 block ,但是由于分派(dispatch)是从主线程发生的,所以 block 的执行必须等到当前 block 执行完毕
  3. 打印“before wait”
  4. 我们等待期望得到满足。此等待使当前线程(即主线程)休眠 2 秒。

那么,即使我们还没有从主线程分派(dispatch)出来,究竟是如何等待成功的呢?我的意思是“等待之后”还没有打印出来!所以我们必须仍然在主线程上。因此,“ block 执行”永远不可能发生。

我的解释有什么问题吗?我猜我一定是 wait 的实现方式

最佳答案

XCTestCasewait(for:timeout:) 与您可能熟悉的 GCD 组/信号量 wait 函数不同.

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

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

无论如何,有关运行循环如何工作的更多信息,请参阅 Threading Programming Guide: Run Loops .

关于ios - 等待要在下一次分派(dispatch)时执行的 block 如何成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com