swift – 如何判断FileHandle什么都没有被读取?

swift – 如何判断FileHandle什么都没有被读取?,第1张

概述我正在尝试使用 Pipe的 fileHandleForReading readabilityHandler读取 Process的 standardOutput和 standardError.但是, terminationHandler被调用的那一刻实际上是在我第一次调用readabilityHandler之前. 我不确定为什么这个过程会这样做,但这意味着我没有获得所有数据,因为我假设进程终止意味着 我正在尝试使用 PipefileHandleForReading readabilityHandler读取 ProcessstandardOutputstandardError.但是,terminationHandler被调用的那一刻实际上是在我第一次调用readabilityHandler之前.

我不确定为什么这个过程会这样做,但这意味着我没有获得所有数据,因为我假设进程终止意味着所有输出都被刷新到管道.既然不是这样,有没有办法告诉我什么时候没有更多的输出要读?我假设涉及检查FileHandle是否仍然打开,但我没有看到API.

以下是我的代码的基本概念示例:

let stdOutPipe = Pipe()let stdErrPipe = Pipe()stdOutPipe.fileHandleForReading.readabilityHandler = { stdOutfileHandle in    let stdOutPartialData = stdOutfileHandle.readDataToEndOffile()    guard !stdOutPartialData.isEmpty else {        print("Time to read,but nothing to be read?") // happens a lot        return    }    self.tempStdOutStorage.append(stdOutPartialData)}stdErrPipe.fileHandleForReading.readabilityHandler = { stdErrfileHandle in    let stdErrPartialData = stdErrfileHandle.readDataToEndOffile()    guard !stdErrPartialData.isEmpty else {        print("Time to read,but nothing to be read?") // happens a lot        return    }    self.tempStdErrStorage.append(stdErrPartialData)}process.standardOutput = stdOutPipeprocess.standardError = stdErrPipeprocess.terminationHandler = { process in    notifyOfCompleteRead(stdOut: self.tempStdOutStorage,stdErr: self.tempStdErrStorage)}mySpecializeddispatchQueue.async(execute: process.launch)
解决方法 在readabilityHandler中,你应该使用availableData来获取
当前可用的数据没有阻塞.空可用数据表示EOF
在文件句柄上,在这种情况下应该删除可读性处理程序.

在过程完成后,可以使用调度组在标准输出和标准错误上等待EOF.

例:

let group = dispatchGroup()group.enter()stdOutPipe.fileHandleForReading.readabilityHandler = { stdOutfileHandle in    let stdOutPartialData = stdOutfileHandle.availableData    if stdOutPartialData.isEmpty  {        print("EOF on stdin")        stdOutPipe.fileHandleForReading.readabilityHandler = nil        group.leave()    } else {        tempStdOutStorage.append(stdOutPartialData)    }}group.enter()stdErrPipe.fileHandleForReading.readabilityHandler = { stdErrfileHandle in    let stdErrPartialData = stdErrfileHandle.availableData    if stdErrPartialData.isEmpty  {        print("EOF on stderr")        stdErrPipe.fileHandleForReading.readabilityHandler = nil        group.leave()    } else {        tempStdErrStorage.append(stdErrPartialData)    }}process.standardOutput = stdOutPipeprocess.standardError = stdErrPipeprocess.launch()process.terminationHandler = { process in    group.wait()    print("OUTPUT:",String(data: tempStdOutStorage,enCoding: .utf8)!)    print("ERROR: ",String(data: tempStdErrStorage,enCoding: .utf8)!)}
总结

以上是内存溢出为你收集整理的swift – 如何判断FileHandle什么都没有被读取?全部内容,希望文章能够帮你解决swift – 如何判断FileHandle什么都没有被读取?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1069987.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存