在后台线程中动态更新UILabel - Swift

时间:2016-03-09 17:59:04

标签: ios swift uilabel

我正在尝试在后台运行的循环函数中动态更新UILabel。从我读过的内容来看,你不能在后台线程中更新UI,而只能在main中更新。我已将dispatch_async添加到我的循环函数中,但仍然只获取要显示的输入字符串的最后一个单词。

这是我的简化代码:

@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    parseString("Hello World")        
}

func parseString(sentence: String) {        
    var wordArr = sentence.componentsSeparatedByString(" ")

    for i in 0...wordArr.count-1 {
        dispatch_async(dispatch_get_main_queue(),
        {
            self.label.text = wordArr[i]
        })
        }
    }    
}

`

1 个答案:

答案 0 :(得分:0)

这是对您的方法的重写,可能会或可能不是您想要的,但它显示了在线程之间共享工作的逻辑,并且还允许UI时间在覆盖它们之前显示部分结果。

func parseString(sentence: String) {
    var wordArr = sentence.componentsSeparatedByString(" ")

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) { () -> Void in
        for i in 0..<wordArr.count {
            let seconds = UInt64(i * 2)
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
                self.label.text = wordArr[i]
            })
        }
    }
}