gpt4 book ai didi

ios - 为什么测试的时候会调用runloop

转载 作者:搜寻专家 更新时间:2023-11-01 06:50:30 24 4
gpt4 key购买 nike

我经常看到 RunLoop.current.run(until: Date()) 在集成测试中被调用。

例如 this article在这个open source project .

文中给出的解释是

The RunLoop.current.run(until: Date()) statement makes sure the run loop associated with the current thread has ample time to let the drawing operations to complete

如果那是真的,我们为什么不给它更多时间,我们如何知道 Date() 是否足够?

我读了一些关于运行循环的文章,在我看来添加这行代码的原因是为了启动应用程序。看起来 appDelegate 通常会自动触发或启动 run loop,但由于我们正在测试,我们需要自己触发 run loop。

我可能缺少对线程或运行循环的一些基本理解,但我希望有人能提供一些见解。

最佳答案

If that is true why wouldn't we give it more time, how do we know that Date() is enough?

我想我们是通过实验知道的。更“正确”的做法是:

  1. 安装一个运行循环观察器,以某种方式检测何时布局和绘制 View 。
  2. 无限期地运行运行循环(直到 Date.distantFuture)。
  3. 在第 1 步安装的观察器中,当它检测到 View 已经布局和绘制时,调用 CFRunLoopStop(CFRunLoopGetMain())

但是,当更简单的方法有效且不太可能中断时,这需要做很多额外的工作,而不仅仅是 RunLoop.current.run(until: Date())

I read a few articles about the run loop and it seems to me like the reason that line of code is added is to start the app. It seems like the appDelegate usually automatically triggers or starts the run loop, but since we are testing we need to trigger the run loop ourselves.

不,应用委托(delegate)不会启动运行循环。 The function UIApplicationMain设置应用程序并启动运行循环。如果你新建一个Objective-C工程,你会发现main.m中的main函数调用了UIApplicationMain。在典型的 Swift 项目中,the @UIApplicationMain attribute附加到应用程序委托(delegate)告诉 Swift 编译器在 AppDelegate.o 中生成等效代码(调用 UIApplicationMainmain 函数)。

I might be missing some fundamental understand of threads or run loops but I hope that someone can give some insight.

应用程序的大部分生命周期都在运行循环中度过,运行循环(简化)具有以下阶段:

  1. 等待一个事件。有很多事件源,包括应用程序启动、触摸、计时器、加速度计、GPS、进入后台、返回前台等等。
  2. 通常通过调用您编写的代码来处理事件。
  3. 如果任何 View 设置了 needsLayout 属性,请布置 View 层次结构的适当部分(包括发送 layoutSubviews 消息)。
  4. 如果任何 View 设置了 needsDisplay 属性,请绘制这些 View (通过发送 drawRect: 消息)。
  5. 回到第 1 步。

关于ios - 为什么测试的时候会调用runloop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57662619/

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