Я пытаюсь использовать – 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. Что я делаю не так?
Спасибо за помощь.
Как бы это сделать приложение закрыть лист, когда работа сделана? Кроме того, приложение, похоже, не достигает readData. –
Я отредактировал ответ – vadian
Даже первая строка вашего измененного кода недействительна. –