从长任务更新加载栏

时间:2017-06-18 04:41:15

标签: ios swift loading

我正在尝试制作加载栏,因为我完成一个长函数可能需要几秒钟。但是我不知道如何弄清楚函数执行的程度以及如何在UI中触发更改。以下是我的工作正常,但我不会完全按照预期行事。有什么建议吗?

func build(_ sender: UIButton) {

    let myMutableString = NSMutableAttributedString(string: "Compiling Latest Clean Build", attributes: [NSFontAttributeName: buildLbl.font])
    buildLbl.attributedText = myMutableString

    let greenStrip = UIView()
    greenStrip.backgroundColor = Colors().green
    greenStrip.frame = CGRect(x: 0, y: buildStatus.frame.height - 2.5, width: 10, height: 2.5)
    buildStatus.addSubview(greenStrip)

    UIView.animate(withDuration: 2.0, animations: {
        // compile can take a while
        compile(structureContent: structuredContent)
        greenStrip.frame = CGRect(x: 0, y: self.buildStatus.frame.height - 2.5, width: self.buildStatus.frame.width, height: 2.5)

    }, completion: {
        (value: Bool) in

        greenStrip.removeFromSuperview()
        let dvc : PreviewViewController = self.storyboard?.instantiateViewController(withIdentifier: "PreviewViewController") as! PreviewViewController
        self.navigationController?.pushViewController(dvc, animated: false)

    })

}

1 个答案:

答案 0 :(得分:0)

您希望跟踪循环通过数据结构的Rectangle函数所做的进展并执行操作。首先,您需要来自compile()函数的委托函数,该函数将进度报告为百分比,以便稍后可以在UI上显示该函数。您可以找到有关委托here的完整教程,您的协议将类似于

compile()

现在,这是报告进度的示例方式。在protocol ProgressDelegate: class { func didFinishTask(progress: Double) } 函数的开头,您希望从数据结构中获取总计作业的计数。然后在for循环的每一轮中,将当前循环计数除以总计数,然后由委托报告此进度。所以你的代码看起来像

compile()

最后,在您的UI视图控制器中接收此委托。更新UI基础,完成任务的百分比。

func compile(){
    ...
    let totalJobs = jobs.count
    let counter = 0.0
    for eachJob in jobs {
        counter += 1.0
        ...
        didFinishTask(progress: counter/totalJobs)
    }
}