如何在Swift中作为类属性实时返回NSLog输出

时间:2016-06-29 00:03:52

标签: ios swift macos nstask

我在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

    })
}

1 个答案:

答案 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方法也极大地简化了代码。

我还添加了这种更新上述问题的方式。