我是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并让视图和控件返回应用程序窗口的任何建议吗?
答案 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。