使用线程使用Swift更新UI

问题描述 投票:13回答:2

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

感谢你们。

xcode multithreading swift xcode6
2个回答
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更新主队列上的标签


32
投票

Swift 3.0 +版本

DispatchQueue.main.async() {
    // your UI update code
}

发表这个是因为XCode无法从swift 2.0版本中建议正确的语法

© www.soinside.com 2019 - 2024. All rights reserved.