【问题标题】:Wait for Completion Handler to Finish等待完成处理程序完成
【发布时间】:2015-02-08 02:41:13
【问题描述】:

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

 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 按钮?

【问题讨论】:

  • println 进入完成块怎么样?
  • 同意。如果您的目标是将文件信息传回给某个调用例程,那么如果您自己的代码也可以使用 completionHandler 模式。

标签: macos cocoa swift nsopenpanel


【解决方案1】:

我认为完成处理程序的重点是在用户选择确定或取消后执行代码。

因此,在用户做出选择之前延迟最后的 println() 语句的唯一方法是从完成处理程序中调用它。

如果您有多个 println 语句要执行,请将它们放在一个函数中并从完成处理程序中调用该函数。

【讨论】:

    【解决方案2】:

    一种解决方案是使用信号量:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多