2016-05-16 3 views
1

Ich versuche – performSelectorOnMainThread:withObject:waitUntilDone: für eine Cocoa-Anwendung zu verwenden, die ich in Swift entwickle. Ich brauche die Anwendung, um zu warten, bis der Job erledigt ist. Wie auch immer, ich habe die folgenden Codezeilen.Swift - Using 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!?") 
} 

Ich bin nicht sicher, wie ich path zu readdata passieren. Xcode verlangt, dass ich das Argument auf etwas anderes als null oder nichts setze. In Objective-C wäre es

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

Wie auch immer, die Anwendung erreicht nie readData. Was mache ich falsch?

Danke für Hilfe.

Antwort

2

Warum nicht

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

Irgendwann haben Sie self.window.endSheet(progSheet) nennen das Blatt zu schließen und die Fertigstellung Handler aufrufen.

Edit:

Ich denke, meinen Sie eigentlich so etwas wie dieses

... 
    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

Wie, dass die Anwendung das Blatt schließen würde, wenn die Arbeit erledigt ist? Außerdem scheint die Anwendung sowieso readData nicht zu erreichen. –

+0

Ich habe die Antwort bearbeitet – vadian

+0

Auch die erste Zeile des geänderten Codes ist nicht gültig. –