NSTask进程挂起我的管道读取

时间:2017-05-15 17:39:01

标签: swift macos

我尝试使用NSTask(或Process,因为这是Swift)来执行xmllint来格式化一些XML数据。问题是任务似乎挂了。

我使用xmllint而不是XMLDocument.xmlData(withOptions:)因为输出更符合我的需要。我正在编写一个工具来编辑现有文件,我想尽量减少影响。

我尝试在挂起时杀死xmllint进程,并获得输出的前84 1/2行。对于该测试用例,输出应该是大约10,000行,并且大多数内容涉及仅嵌套几个级别的元素,因此它不是非常复杂的任务。

我是否正确设置了流程和管道?文档含糊不清,我很难找到直接适用的例子。

代码:

  public static func format(xml: XMLDocument) -> Data?
  {
    let data = xml.xmlData
    let task = Process()
    let inPipe = Pipe()
    let outPipe = Pipe()


    task.launchPath = "/usr/bin/xmllint"
    task.arguments = ["--format", "-"]
    task.standardInput = inPipe
    task.standardOutput = outPipe
    task.launch()
    inPipe.fileHandleForWriting.write(data)
    inPipe.fileHandleForWriting.closeFile()
    task.waitUntilExit()  // Hangs :(
    return outPipe.fileHandleForReading.availableData
  }

0 个答案:

没有答案