Swift2 NSOpenPanel赢得';在Swift功能期间,不能正确关闭

Swift2 NSOpenPanel赢得';在Swift功能期间,不能正确关闭,swift2,xcode7,osx-elcapitan,nsopenpanel,Swift2,Xcode7,Osx Elcapitan,Nsopenpanel,我是Swift(2.2)的新手,在使用Xcode 7.3和OS X 10.11的简单应用程序时遇到了问题。在这个应用程序中,用户单击一个按钮并通过NSOpenPanel选择一个文件。代码使用选定的URL获取文件的数据和名称,然后处理数据并将结果保存到其他地方。对于大文件,处理可能需要几秒钟。处理大型文件时,一旦选择文件,打开文件窗口的空间将保持空白,覆盖应用程序视图和其他所有内容,并一直保持空白,直到操作完成。此外,在操作完成之前,应用程序的出口将被冻结。NSOpenPanel似乎没有将窗口控制

我是Swift(2.2)的新手,在使用Xcode 7.3和OS X 10.11的简单应用程序时遇到了问题。在这个应用程序中,用户单击一个按钮并通过NSOpenPanel选择一个文件。代码使用选定的URL获取文件的数据和名称,然后处理数据并将结果保存到其他地方。对于大文件,处理可能需要几秒钟。处理大型文件时,一旦选择文件,打开文件窗口的空间将保持空白,覆盖应用程序视图和其他所有内容,并一直保持空白,直到操作完成。此外,在操作完成之前,应用程序的出口将被冻结。NSOpenPanel似乎没有将窗口控制权交还给应用程序和系统

代码如下所示:

@IBAction func processFile(sender: AnyObject) {  
     var chosenURL: NSURL?  
     let openPanel = NSOpenPanel()  
     openPanel.title = "Choose a file"  
     openPanel.canChooseDirectories = false  
     openPanel.allowsMultipleSelection = false  

     if openPanel.runModal() == NSFileHandlingPanelOKButton {  
          chosenURL = openPanel.URL  
     }  
     let dataBytes = NSData(contentsOfURL: chosenURL!)  
     let fileName = chosenURL!.lastPathCompnent!  
     // Remaining code processes dataBytes and fileName  

我尝试了一些变化,但得到了相同的结果。在网上搜索“NSOpenPanel不会关闭”通常只会带来Objective-C中的示例,我对此一无所知。关于如何关闭NSOpenPanel并使视图和控制返回到应用程序窗口的任何建议?

根据Eric D的建议,我研究了Grand Central调度和后台流程。我的第一个方法是:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
dataBytes = NSData(contentsOfURL: chosenURL!)
}

这没有改变任何事情。我发现我必须将剩下的整个过程(从“let dataBytes…”开始)放在调度闭包中,在UI更新周围使用“dispatch\u async(dispatch\u get\u main\u queue())”语句。这阻止了窗口冻结和空白,并将控制权返回到应用程序。再次感谢您,Eric。

NSData(contentsOfURL:chosenURL!)
这就是阻止您的UI的原因。你应该在后台获取数据,我不知道这意味着什么。这和GCD有关系吗?