2016-05-16 4 views
1

Я пытаюсь использовать – performSelectorOnMainThread:withObject:waitUntilDone: для приложения Cocoa, которое я разрабатываю в Swift. Мне нужно приложение, чтобы ждать, пока работа не будет выполнена. Во всяком случае, у меня есть следующие строки кода.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!?") 
} 

Я не знаю, как я прохожу path к readData. Xcode требует от меня установить аргумент для чего-то другого, кроме нулевого или ничего. В Objective-C это будет

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

В любом случае приложение никогда не достигает readData. Что я делаю не так?

Спасибо за помощь.

ответ

2

Почему не

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

В какой-то момент вы должны позвонить self.window.endSheet(progSheet) отклонить простыню и вызвать обработчик завершения.

Edit:

Я думаю, вы на самом деле означает что-то вроде этого

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

Даже первая строка вашего измененного кода недействительна. –

Смежные вопросы