从ViewController函数循环中更新NSProgress显示



我又回来了!

在我的ViewController类中,我具有通过数组中一系列项目进行迭代的函数。我想发生的事情是在循环的每次迭代中更新我的进度栏更新,但是看来它不会更新屏幕上的进度栏,直到完成整个循环并退出我的功能。

我可以肯定的是,这仅仅是因为每次通过应用程序循环一次重新绘制一次(我可能不使用正确的术语。(

当我仍在viewController函数循环中时,将有什么适当的方法强制迫使ViewController视图更新?

这基本上是我现在正在做的事情:

func myFunction() {
     for item in collection {
         progressBar.increment(by:1)
         progressBar.display()
     }
     // execute my other code
}

当它不起作用时,我尝试在progressbar.draw方法之后添加需求setDisplay,如以下:

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中编码以来已经至少十年了(又名我忘记了我所知道的大部分。(

谢谢!

edit 我尝试过的另一件事是致电progressBar.displayAsNeeded(),但似乎也行不通。

假设您在主线程上运行,则阻止方法直到方法完成。无论哪种"需要"样式方法(SetneedSdisPlay,Displayasneded等(,您都尝试使用实际的重新播放,直到完成该方法完成(将显示更新进行分组以避免其不断更新(。

(。

您可以做的是将工作放在背景线程上,然后将UI更新放回与此类似的主线程中:

DispatchQueue.global(qos: .background).async {
    for item in collection {
        DispatchQueue.main.async {
            progressBar.increment(by:1)
            progressBar.display()
        }
    }
}

当然会提出其他问题,例如用户现在可以在背景线程处理时与UI进行交互。

如果您已经在背景线程中运行,则只需要将Progress Bar更新派遣到主线程。

相关内容

  • 没有找到相关文章

最新更新