使用线程使用Swift更新UI

Mat*_*att 15 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 
        */ 
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,一旦我点击按钮,我看到结果列表需要一段时间,在应用程序冻结的主要时间.那是因为我没有使用任何线程来处理这个问题.我怎样才能实现线程以查看循环的每一步都更新的每个标签?我是线程和Swift的新手,所以我需要一些帮助!

感谢你们.

Fan*_*ing 35

Swift 3.0版

DispatchQueue.main.async() {
    // your UI update code
}
Run Code Online (Sandbox Code Playgroud)

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

  • iOS 12.2,Swift5.0✅ (2认同)

mus*_*afa 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

dispatch_async函数异步运行给定队列上的代码块.在第一次dispatch_async调用中,我们调度代码以在后台队列上运行.我们得到后,result我们更新主队列上的标签result

  • 我不知道cocoa是否属实,但在cocoa touch中你永远不应该在主线程之外访问ui代码.因此,在第一次调度和第二次调度块之前,访问ui代码是安全的 (2认同)