在Swift功能期间,NSOpenPanel将无法正常关闭

时间:2016-06-02 14:24:39

标签: swift2 xcode7 osx-elcapitan 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并让视图和控件返回应用程序窗口的任何建议吗?

1 个答案:

答案 0 :(得分:1)

根据Eric D的建议,我查看了Grand Central Dispatch和后台流程。我的第一个方法是:

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

这没有改变任何事情。我发现我必须在调度闭包中放置整个剩余的进程(从'let dataBytes ...'开始的所有内容),并在UI更新周围使用'dispatch_async(dispatch_get_main_queue())'语句。这使窗口停止冻结和消隐,并将控制权返回给应用程序。再次感谢,Eric。