2015-02-08 217 views
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)") 


     } 

     }) 

    println("File Desc:\(self.fileDes)") 

在代碼的最後println語句,執行上述命令的用戶有機會選擇一個文件,並在NSOpenPanel,然後單擊確定。 有沒有辦法延遲進一步的代碼運行,直到確定按鈕被選中?

+1

有關'println'搬入完成塊怎麼辦? – 2015-02-08 04:14:06

+0

同意。如果您的目標是將文件信息傳遞迴某些調用例程,那麼也可以使用completionHandler模​​式(如果您使用自己的代碼)。 – Rob 2015-02-08 04:38:23

回答

0

我認爲完成處理程序的重點是在用戶選擇Ok或Cancel後執行代碼。

所以延遲最終println()語句直到用戶做出選擇的唯一方法是從完成處理程序調用它。

如果您有多個println語句要執行,請將它們放入一個函數中並從完成處理函數中調用該函數。

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