当前位置: 首页 > 面试题库 >

使用Swift将NSTask实时输出到NSTextView

鲜于承基
2023-03-14
问题内容

我正在使用NSTask运行rsync,并且希望状态显示在窗口内滚动视图的文本视图中。现在我有这个:

let pipe = NSPipe()
task2.standardOutput = pipe
task2.launch()

let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: NSASCIIStringEncoding)! as String

textView.string = output

这就是我有关传输的一些统计信息,但我想实时获取输出,例如在Xcode中运行该应用程序并将其放入文本视图时所打印的内容。有没有办法做到这一点?


问题答案:

您可以使用通知从管道异步读取。这是一个演示其工作原理的简单示例,希望可以帮助您入门:

let task = NSTask()
task.launchPath = "/bin/sh"
task.arguments = ["-c", "echo 1 ; sleep 1 ; echo 2 ; sleep 1 ; echo 3 ; sleep 1 ; echo 4"]

let pipe = NSPipe()
task.standardOutput = pipe
let outHandle = pipe.fileHandleForReading
outHandle.waitForDataInBackgroundAndNotify()

var obs1 : NSObjectProtocol!
obs1 = NSNotificationCenter.defaultCenter().addObserverForName(NSFileHandleDataAvailableNotification,
    object: outHandle, queue: nil) {  notification -> Void in
        let data = outHandle.availableData
        if data.length > 0 {
            if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {
                print("got output: \(str)")
            }
            outHandle.waitForDataInBackgroundAndNotify()
        } else {
            print("EOF on stdout from process")
            NSNotificationCenter.defaultCenter().removeObserver(obs1)
        }
}

var obs2 : NSObjectProtocol!
obs2 = NSNotificationCenter.defaultCenter().addObserverForName(NSTaskDidTerminateNotification,
    object: task, queue: nil) { notification -> Void in
        print("terminated")
        NSNotificationCenter.defaultCenter().removeObserver(obs2)
}

task.launch()

而是print("got output: \(str)")可以将接收到的字符串附加到文本视图中。

上面的代码假定运行循环处于活动状态(在默认的Cocoa应用程序中就是这种情况)。



 类似资料:
  • 问题内容: 我有一些代码需要花几分钟的时间来处理,它必须为长数组中的每个字符串连接到Web,每个字符串都是一个url。我想这样做,以便每次连接时都应刷新jtextarea,以使用户不会盯着看起来冻结20分钟的空白页。或需要多长时间 这是我尝试但没有成功的示例: 问题答案: 问题是您需要异步执行计算。您应该创建一个执行计算的后台线程,然后使用SwingUtilities.invokeLater更新J

  • 问题内容: 我有一些代码需要花几分钟的时间来处理,它必须为长数组中的每个字符串连接到Web,每个字符串都是一个url。我想这样做,以便每次连接时都应刷新jtextarea,以使用户不会盯着看起来冻结20分钟的空白页。或需要多长时间 这是我尝试但没有成功的示例: 问题答案: 问题是您需要异步执行计算。您应该创建一个执行计算的后台线程,然后使用SwingUtilities.invokeLater更新J

  • 问题内容: 我有这个模板: 呈现为: 如果我将其发送到http.ResponseWriter,则输出文本将转义。 我怎么能这样写一个json? 问题答案: 您不应该使用Go的模板引擎(也不是)来生成JSON输出,因为模板引擎不了解JSON语法和规则(转义)。 而是使用包来生成JSON。您可以用来直接将响应写入/流式传输到,例如。 例: 输出(在Go Playground上尝试):

  • 我在Ubuntu 14.04上使用Hadoop-1.2.1 我正在尝试使用Flume-1.6.0将数据从twitter流式传输到HDFS。我已经下载了Flume-sources-1.0-SNAPSHOT。jar并将其包含在flume/lib文件夹中。我已经设置了flume-sources-1.0-SNAPSHOT的路径。jar在conf/FLUME环境中显示为FLUME_CLASSPATH。这是我

  • 问题内容: 我想在我的ipython Notebook中运行bash脚本,并将输出另存为python变量中的字符串,以进行进一步操作。基本上,我想将bash magic的输出传递给一个变量,例如,类似这样的输出: 问题答案: 怎么使用这个: 而不是魔术?使用该符号将以下命令作为shell命令运行,结果全部存储在中。要运行多个命令并收集所有命令的输出,只需组合一个快速的shell脚本即可。

  • 在运行将StringBuilder的内容保存到.xlsx文件的代码时,它给出了以下错误: 线程“main”java.lang.nosuchmethoderror:org.apache.poi.util.poilogger.log(iljava/lang/object;ljava/lang/throwable;)V在org.apache.poi.openxml4j.opc.zippackage.bu