使用线程使用Swift更新UI

时间:2014-11-30 10:28:50

标签: xcode multithreading swift xcode6

我正在使用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的新手,所以我需要一些帮助!

谢谢你们。

2 个答案:

答案 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

更新主队列上的标签