我在Swift中有两个类,一个是ViewController.swift,另一个是业务逻辑,名为Brain.swift。在Brain.swift中,我有一个类,其中包含一个名为convert()的函数,该函数执行NSTask。
在ViewController.swift中,所有UI更新都会发生。
我想要完成的是将convert()的NSTask的输出转换为ViewController中的TextView。
我已经实现了this answer的解决方案,但我有点新手所以我不确定如何将其作为类属性实时返回以供其他类访问。
Brain.swift
import Foundation
internal func convert(chosenFile: NSURL, addText: (newText: String) -> Void) {
let bundle = NSBundle.mainBundle()
let task = NSTask()
let outputPipe = NSPipe()
task.standardOutput = outputPipe
let outHandle = outputPipe.fileHandleForReading
outHandle.readabilityHandler = { outputPipe in
if let line = String(data: outputPipe.availableData, encoding: NSUTF8StringEncoding) {
addText(newText: line)
} else {
print("Error decoding data: \(outputPipe.availableData)")
}
}
task.launch()
task.waitUntilExit()
}
ViewController.swift
@IBAction func Run(sender: AnyObject) {
let qualityOfServiceClass = QOS_CLASS_USER_INITIATED
let userInitiatedQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(userInitiatedQueue, {
self.btnConvert.enabled = false
self.btnSelect.enabled = false
self.activitySpinner.hidden = false
self.activitySpinner.startAnimation(self)
convert(self.inputFile.chosenFile) { newText in
self.statusText.stringValue = "\(newText)"
}
})
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.statusText.stringValue = "Done!"
self.activitySpinner.hidden = true
self.activitySpinner.stopAnimation(self)
self.btnSelect.enabled = true
})
}
答案 0 :(得分:0)
这应该有效:
func convert(chosenFile: NSURL, addText: (newText: String) -> Void) {
let task = NSTask()
// Set up task
let pipe = NSPipe()
task.standardOutput = pipe
let outHandle = pipe.fileHandleForReading
outHandle.readabilityHandler = { pipe in
if let line = String(data: pipe.availableData, encoding: NSUTF8StringEncoding) {
addText(newText: line)
} else {
print("Error decoding data: \(pipe.availableData)")
}
}
task.launch()
}
您可以这样称呼它:
convert(myURL) { newText in
print("New output available: \(newText)")
}
我从你的班级开出了一个功能,因为当你只是将它用于一个功能时,没有理由去上课。 readabilityHandler
方法也极大地简化了代码。
我还添加了这种更新上述问题的方式。