等待完成处理程序完成

时间:2015-02-08 02:41:14

标签: macos cocoa swift nsopenpanel

我在完成处理程序之后有代码,它依赖于完成处理程序的完成。

 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之前执行。 有没有办法延迟进一步运行代码,直到实际选择了确定按钮?

2 个答案:

答案 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)")