gpt4 book ai didi

ios - Swift:Gui 没有更新/太晚了

转载 作者:行者123 更新时间:2023-11-30 12:22:38 25 4
gpt4 key购买 nike

我目前正在使用 swift 和 xcode 为 iphone 编写一个 Quiz-App。自从一周以来我一直遇到一个问题,直到今天我都无法解决。

一些背景信息:

所有问题都在线存储在服务器上并及时下载。问题始终包含图像,因此加载它们需要一些时间。这就是为什么我在用户仍在思考当前问题时在后台预加载下一个问题。因此,我使用继承了 ThreadQuestionLoader 类。

问题情况:

当用户回答问题并按下继续按钮时,会触发goToNextQuestion()函数,向用户显示下一个问题。要么下一个问题预加载完成,可以立即显示,要么下一个问题仍在加载,我们必须等待。

问题:

现在,如果我们必须等待,我想显示一个加载标签和指示器。两者都在 GUI 中(与界面构建器一起放置)并且当时是隐藏的。我这样做是这样的:

func goToNextQuestion()
{
//check if next question is already ready
if (nextQuestionLoader.isFinished==false)
{
//not ready, so wait and show waiting indication
labelLoading.isHidden = false
loadingIndicator.startAnimating()
while(nextQuestionLoader.isFinished == false) {}
//question i now ready, hide waiting indication
labelLoading.isHidden = true
loadingIndicator.stopAnimating()
}

//so next question is ready and all good
}

我想要发生的是,当用户按下继续并且下一个问题尚未准备好时,loadingIndicatorlabelLoading> 会一直显示,直到问题准备好为止。

现在发生的情况是,按下继续,没有显示任何内容,并且 gui 被阻止,直到问题准备就绪,然后它显示下一个问题,并且下一个问题也会发生同样的情况。

Screenshots of the area of my gui that is concerned for better visualitzation(很抱歉截图中获得的分数不同,与问题无关,只是两张不同的截图)

因此,在问题完全加载之前,GUI 更新不会发生,也不会立即发生!

其他信息

  • 我尝试在代码的其他位置显示加载指示器,它们显示正确,因此没有问题。
  • 当我在 while 循环之前和之后放置 print 命令并跟踪终端中的输出时,我发现 print 命令在 while 循环之前和之后正确执行。但 gui 更新只会在之后发生
  • 函数goToNextQuestion完全在主线程中执行!

那么我怎样才能实现直接显示加载指示,并且在显示后,while循环等待另一个线程的完成?

我真的很绝望,因为我根本不知道如何解决这个问题。

我真的非常感谢您的帮助!

非常感谢您抽出宝贵的时间!!

最佳答案

您的方法存在几个问题。

首先,你不应该使用NSThread/Thread。系统类 URLSession 为您处理异步下载。 (创建线程成本高昂且容易出错。)请改用 URLSession。您应该能够在网上找到很多示例,包括此处。

其次,您不能像使用

那样阻塞主线程
    while(nextQuestionLoader.isFinished == false) {}

代码。由于您的下载在后台线程上运行,它将继续运行,但通过阻止主线程,一切都会卡住,直到下载完成。在下载完成之前,您的 UI 更改没有机会绘制在屏幕上。

您应该做的是使用委托(delegate)方法或完成闭包来使用URLSession。它支持这两种方法。

我有一个名为 Async_demo 的项目在 Github 上,其中包含演示如何使用 URLSession 的工作代码。这是一个简化的示例,但它应该可以帮助您入门。

关于ios - Swift:Gui 没有更新/太晚了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44608973/

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