UIProgressView 和定期刷新(在 Swift 中)

Jon*_*n M 2 refresh uiprogressview swift

我需要解析大量文本,并希望在此过程中向用户提供一些反馈。

环境是 Swift,虽然我确实在 Obj-C 中看到了一些代码 ([self performSelector:@selector(.....)),它没有多大意义。如果我知道如何将其嵌入到 Swift 方法中,我会这样做。

我可以用一个可重现的小案例来总结这个问题,它给出了相同的结果。即在循环中,增加一个值,显示进度并返回直到完成。显然,进度不会显示,因为 iOS 在刷新屏幕之前等待循环完成。

这是有道理的,所以我想在不同的时间间隔中断处理(即循环)并在继续处理之前刷新进度条。

我当前的代码如下所示:

@IBAction func goButton(sender: UIButton) {
    currentCounter = 0
    target = textTarget.text.toInt()!
    step = textStep.text.toInt()!
    updateProgressBar()
    while currentCounter < target {
        currentCounter += step
        updateProgressBar()
    }
}

func updateProgressBar() {
    var percentage = Float(currentCounter) / Float(target) * 100
    progressPercentage.text = "\(percentage) %"
    println("progress = \(percentage)")
    progressBar.setProgress(percentage, animated: false)
}
Run Code Online (Sandbox Code Playgroud)

我看到了以下内容:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    // do some task here... 
}
dispatch_async(dispatch_get_main_queue()) {
    // do another task here...
}
Run Code Online (Sandbox Code Playgroud)

我如何使用这种方法(如果它相关),如果我这样做了,处理与刷新调用会在哪里?

乔恩

wlt*_*rup 5

GCD(Grand Central Dispatch)绝对是更好的选择。它使用起来简单、强大且直观,尽管最初的语法可能会有所暗示。

在进行耗时的工作时更新 UI 的方法的要点始终是:

  1. 您的应用正在主队列中运行
  2. 在某些时候,您想要做一些耗时的工作,因此将这些工作发送到主队列以外的某个队列。使用dispatch_async具有比主队列以外的队列(有内置的队列,你可以使用这个,或者你可以创建自己的)
  3. 在您想要更新 UI 的耗时工作中。UI 应该总是主队列中更新,所以从那个耗时的工作中,你做另一个dispatch_async,这次使用主队列(有一种方法可以访问主队列)。
  4. 在内部dispatch_async,你更新你的 UI。

有关在 Swift 上下文中使用 GCD 的精美而全面的教程,请查看