Swift:尝试在循环中更新NSTextField,但它只获取最后一个值

时间:2014-06-15 14:23:16

标签: cocoa for-loop swift nstextfield

我非常简单的程序循环遍历数组以导出多个文件。 当它处于循环中时,我希望更新文本字段以告诉用户当前正在导出哪个文件。 代码如下所示:

for item in filesArray {
    var fileName = item["fileName"]

    fileNameExportLabel.stringValue = "Exporting \(fileName).ext"
    println("Exporting \(fileName).ext")

    //--code to save the stuff goes here--
}

会发生什么:println正常工作,为每个文件丢弃一条消息,但名为fileNameExportLabel的标签仅在导出最后一个文件时更新,因此它为空在整个循环期间,一旦循环结束,就获得最后一个文件名。

任何想法?我在这里是一个总菜鸟,我想知道NSTextField是否需要更新命令,类似于表视图。

提前致谢!

2 个答案:

答案 0 :(得分:4)

您的循环正在主线程上运行。在您的功能完成之前,UI更新不会发生。由于这需要很长时间,因此您应该在后台线程上执行此操作,然后更新主线程上的文本字段。

试试这个:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    for item in filesArray {
        var fileName = item["fileName"]

        // Update the text field on the main queue
        dispatch_async(dispatch_get_main_queue()) {
            fileNameExportLabel.stringValue = "Exporting \(fileName).ext"
        }
        println("Exporting \(fileName).ext")

        //--code to save the stuff goes here--
    }
}

答案 1 :(得分:0)

在Swift 4上对我来说这很有用

DispatchQueue.global(qos: .default).async {
    for item in filesArray {
        var fileName = item["fileName"]

        // Update the text field on the main queue
        DispatchQueue.main.async {
            fileNameExportLabel.stringValue = "Exporting \(fileName).ext"
        }
        print("Exporting \(fileName).ext")

        //--code to save the stuff goes here--
    }
}