我正在尝试在执行具有状态关闭和完成关闭的函数时更新我的UI。 UI仅在闭包完成时更新。我知道发生这种情况是因为主线程上没有发生操作,需要在主线程上更新UI。我已经尝试将UI更新移动到主线程,但没有任何运气。我已经包含了我的代码的简化版本。
我该如何解决这个问题?如果我为我的代码指定一个自定义线程,它会解决问题吗?如果是这样,那怎么办?
非常感谢您花时间阅读。
代码包括在下面。如果您需要有关此问题的更多信息,请与我们联系。
func parse(array: [String], status:(status: String!, progress: Float!) -> (), completion:(result: [String]!) ->()) -> () {
status(status: "Process is starting.", progress: 0)
var newArray = [String]()
for (index, txt) in enumerate(array) {
//Update status
let progress = Float(index + 1) / Float(array.count)
status(status: "Checking string: \(txt)", progress: progress)
//Do something with txt
let newTxt = txt + "OK"
newArray.append(newTxt)
}
status(status: "Complete!", progress: 1.0)
//Send completion
completion(result: newArray)
}
var startArray = [String]()
for index in 0...10000 {
startArray.append("\(index)")
}
parse(startArray, { (status: String!, progress: Float!) -> () in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
println(status)
self.statusLabel.text = status
println(progress)
self.progressView.progress = progress
})
}, { (result: [String]!) -> () in
println("Process complete. Here is the result:\n\(result)")
})
答案 0 :(得分:0)
我的问题是在主线程上调用了解析,因此在更新UI时,该线程已被阻止。我通过将解析放入另一个线程,然后使用GCD更新主线程上的UI来解决问题(在David的评论的帮助下)。