我正在尝试在后台运行的循环函数中动态更新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]
})
}
}
}
`
答案 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]
})
}
}
}