【发布时间】:2017-06-08 13:02:29
【问题描述】:
我又回来了蜂巢思维!
在我的 ViewController 类中,我有一个函数可以遍历数组中的一系列项目。我想要发生的是在循环的每次迭代中更新我的进度条,但它似乎在完成整个循环并退出我的函数之前不会更新屏幕上的进度条。
我很确定这仅仅是因为每次通过应用程序循环时视图只会重绘一次(我可能在这里没有使用正确的术语。)
当我仍在 ViewController 函数循环中时,强制 ViewController 视图更新的正确方法是什么?
这基本上是我现在正在做的事情:
func myFunction() {
for item in collection {
progressBar.increment(by:1)
progressBar.display()
}
// execute my other code
}
当这不起作用时,我尝试在 progressBar.draw 方法之后添加一个 needsSetDisplay,如下所示:
func myFunction() {
for item in collection {
progressBar.increment(by:1)
progressBar.display()
let rect = self.view.visibleRect
self.view.needsSetDisplay(rect)
}
// execute my other code
}
但还是不行。
我确信有一种方法可以完成我需要做的事情,但我怀疑它涉及一些更高级的事情,例如运行多个进程,我可能还没有资格做这件事,因为我是新手到 Swift,距离我用 Obj-C 编码已经至少 10 年了(也就是我忘记了我所知道的大部分内容。)
谢谢!
编辑我尝试的另一件事是致电progressBar.displayAsNeeded(),但它似乎也不起作用。
【问题讨论】:
-
你知道你的函数在哪个线程上运行吗?你可以在你的函数中设置一个断点,并在你的断点被命中时检查它在 Xcode 左侧运行的线程。如果它不是主线程(线程 1),那么这很可能是您的问题,因为所有 UI 更新都将在主线程上运行。要解决这个问题,请查看
DispatchQueue.main.async。
标签: swift redraw nsprogress