我在完成处理程序之后有代码,它依赖于完成处理程序的完成。
openFilePanel.beginWithCompletionHandler({ (result) -> Void in
if result == NSFileHandlingPanelOKButton{
self.fileURL = openFilePanel.URL
self.window.title = self.fileManager.displayNameAtPath(self.fileURL!.absoluteString!)
self.pathControl.URL = self.fileURL
self.webView.mainFrameURL = self.fileURL!.absoluteString!
self.fileDes = open("\(self.fileURL!.path!)", O_RDONLY)
println("File Des:\(self.fileDes)")
}
})
println("File Desc:\(self.fileDes)")
上述代码中的最终println语句在用户有机会选择文件并在NSOpenPanel中单击OK之前执行。 有没有办法延迟进一步运行代码,直到实际选择了确定按钮?
答案 0 :(得分:0)
我认为完成处理程序的重点是在用户选择“确定”或“取消”后执行代码。
因此,在用户做出选择之前延迟最终println()语句的唯一方法是从完成处理程序中调用它。
如果您要执行多个println语句,请将它们放在函数中并从完成处理程序中调用该函数。
答案 1 :(得分:0)
一种解决方案是使用信号量:
let semaphore = dispatch_semaphore_create(0) // 1-
openFilePanel.beginWithCompletionHandler({ (result) -> Void in
if result == NSFileHandlingPanelOKButton{
self.fileURL = openFilePanel.URL
self.window.title = self.fileManager.displayNameAtPath(self.fileURL!.absoluteString!)
self.pathControl.URL = self.fileURL
self.webView.mainFrameURL = self.fileURL!.absoluteString!
self.fileDes = open("\(self.fileURL!.path!)", O_RDONLY)
println("File Des:\(self.fileDes)")
dispatch_semaphore_signal(semaphore) // 2-
}
})
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) // 3-
println("File Desc:\(self.fileDes)")