我正在使用Swift开发一个使用Xcode 6的软件。当我按下一个按钮时,我的代码从网上获取一些信息并将它们写在我的NSWindow上。
想象一下这样的事情:
@IBAction func buttonPressed(sender: AnyObject)
{
for page in listOfPages //Number of pages is 40.
{
var label: NSTextField = NSTextField();
label.stringValue = getInformetionsFromPage(page)
/*
some code to add label in the window here
*/
}
}
问题是,一旦我点击按钮,在我看到结果列表之前需要一段时间,在应用程序冻结的主要时间。那是因为我没有使用任何线程来处理这个问题。我怎样才能实现线程以查看循环的每一步都更新的每个标签?我是线程和Swift的新手,所以我需要一些帮助!
谢谢你们。
答案 0 :(得分:31)
Swift 3.0 +版本
DispatchQueue.main.async() {
// your UI update code
}
发布此内容是因为XCode无法从swift 2.0版本
建议正确的语法答案 1 :(得分:13)
有GCD。这是一个基本用法:
for page in listOfPages {
var label = NSTextField()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let result = getInformationFromPage(page)
dispatch_async(dispatch_get_main_queue()) {
label.stringValue = result
}
}
}
dispatch_async
函数异步运行给定队列上的代码块。在第一个dispatch_async
调用中,我们调度代码以在后台队列上运行。获得result
后,我们使用result