【发布时间】:2016-06-29 00:03:51
【问题描述】:
我在 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
})
}
【问题讨论】: