如何等待成功等待下一次调度执行的块?

问题描述 投票:0回答:2
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秒钟。因此,即使我们仍未从主线程中分派出去,等待的方式还是成功了。我的意思是“等待后”尚未打印!因此,我们必须仍然在主线程上。因此,“块执行”从来没有机会发生。
  5. 我的解释怎么了?我猜想我必须与wait的实现方式有关

导入XCTest @testable导入TestWait类TestWait:XCTestCase {func testX(){保护Thread.isMainThread其他{fatalError()} let exp =期望(...

wait功能最有可能在内部利用NSRunLoop。运行循环不会像sleep函数那样阻塞主线程。尽管函数testX不在运行循环上执行,但它仍接受在线程中调度的事件并分派要执行的事件
ios swift multithreading grand-central-dispatch xctest
2个回答
0
投票

如有疑问,请查看源代码!

整个等待代码并不简单,但实际等待归结为:

_ = runLoop.run(mode: .default, before: Date(timeIntervalSinceNow: timeIntervalToRun))

您不应该以

threads

来考虑等待,而是以
queues>]来考虑等待。通过RunLoop.current.run(),您基本上可以告诉当前代码开始执行队列中的其他项目。

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.