2016-05-16 7 views
1

Swiftで開発しているCocoaアプリケーションに– performSelectorOnMainThread:withObject:waitUntilDone:を使用しようとしています。私は、仕事が完了するまで待つようにアプリケーションが必要です。とにかく、次のコード行があります。Swift - performSelectorOnMainThreadを使用

func recoverData(path:String) -> Void { 
    let sheetRect:NSRect = NSMakeRect(0,0,400,114) 
    let progSheet:NSWindow = NSWindow.init(contentRect:sheetRect, styleMask:NSTitledWindowMask,backing:NSBackingStoreType.Buffered,`defer`:true) 
    let contentView:NSView = NSView.init(frame:sheetRect) 
    let progInd:NSProgressIndicator = NSProgressIndicator.init(frame:NSMakeRect(190,74,20,20)) 
    progInd.style = NSProgressIndicatorStyle.SpinningStyle 
    let msgLabel:NSTextField = NSTextField.init(frame:NSMakeRect(20,20,240,46)) 
    msgLabel.stringValue = "Copying selected file..." 
    msgLabel.bezeled = false 
    msgLabel.drawsBackground = false 
    msgLabel.editable = false 
    msgLabel.selectable = false 
    contentView.addSubview(msgLabel) 
    contentView.addSubview(progInd) 
    progSheet.contentView = contentView 

    self.window.beginSheet(progSheet) {(NSModalResponse returnCode) -> Void in 
     progSheet.makeKeyAndOrderFront(self) 
     progInd.startAnimation(self) 
     let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
     dispatch_async(dispatch_get_global_queue(priority,0)) { 

      ////////////////////////////////////////////////////////////////////////////////////////////////// 
      self.performSelectorOnMainThread(Selector(self.readData(path)),withObject:path,waitUntilDone:true) 
      ////////////////////////////////////////////////////////////////////////////////////////////////// 

     } 

     dispatch_async(dispatch_get_main_queue()) { 
      progInd.indeterminate = true 
      self.window.endSheet(progSheet) 
      progSheet.orderOut(self) 
     } 
    } 
} 

func readData(path:String) -> Void { 
    print("Hello!?") 
} 

私はどのようにreadDataにpathを渡すのか分かりません。 Xcodeでは、引数をnil以外のものに設定する必要があります。 Objective-Cでは、

[self performSelectorOnMainThread:@selector(readData:) withObject:path waitUntilDone:YES]; 

とにかく、アプリケーションはreadDataに到達しません。私は間違って何をしていますか?

ありがとうございました。

答えて

2

なぜあなたはシートを閉じ、完了ハンドラを呼び出すためにself.window.endSheet(progSheet)を呼び出す必要がある時点で

self.window.beginSheet(progSheet) {(returnCode) -> Void in 
    dispatch_async(dispatch_get_main_queue()) { 
     progInd.startAnimation(self) 
     self.readData(path) 
     progInd.indeterminate = true 
    } 
} 

編集:

私はあなたが実際にどのようにジョブが実行されたときにアプリケーションがシートを閉じなるだろう。この

... 
    self.window.beginSheet(progSheet) {(returnCode) -> Void in 
    progInd.stopAnimation(self) 
    progInd.indeterminate = true 

    } 

    progInd.startAnimation(self) 
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
    dispatch_async(dispatch_get_global_queue(priority,0)) { 
    self.readData(path) { 
     dispatch_async(dispatch_get_main_queue()) { 
     self.window.endSheet(progSheet) 
     } 
    } 
    } 
} 

func readData(path:String, completion: (() -> Void)) { 
    print("Hello!?") 
    completion() 
} 
+0

のようなものを意味すると思いますか?また、アプリケーションはreadDataに到達していないようです。 –

+0

私は答えを編集しました – vadian

+0

修正されたコードの最初の行でさえ無効です。 –

関連する問題