swift - NSTask 输出缓冲区大小问题(运行 SPApplicationsDataType 命令)

标签 swift macos buffer nstask system-profiler

尝试从系统分析器中读取一些信息。为此,我使用 NSTask 运行一些终端行命令。如果我运行一些输出不太大的命令,就没有问题。(例如:SPInstallHistoryDataType)但是如果我运行“SPApplicationsDataType”命令来收集已安装的应用程序列表,NSTask 等待太多,没有任何结果和任何错误。

所以我开始认为应该有一个缓冲区大小或类似的东西,但我找不到任何相关信息。我不知道也许我走错了路。

func readData (dataType: String) -> NSArray? {
let out = NSPipe()
let task = NSTask()
task.launchPath = "/usr/sbin/system_profiler"
task.arguments = ["-xml",dataType]
task.standardOutput = out
task.launch()

task.waitUntilExit()

if task.terminationStatus != 0 {
    NSLog("system_profiler returned error status")
    return nil
}

let data = out.fileHandleForReading.readDataToEndOfFile()
let plist : AnyObject?
do {
    plist = try NSPropertyListSerialization.propertyListWithData(data,
        options: [.Immutable],
        format: nil)
} catch let error as NSError {
    NSLog("%@", "Failed to parse system_profiler results. \(error.localizedDescription)")
    return nil
}

return plist as? NSArray
}
let r = readData("SPInstallHistoryDataType")// There is no problem
let r2 = readData("SPApplicationsDataType") // Crash

注意:是的,我可以将此数据写入文件并从该文件中读取。但我尝试了解问题所在。

最佳答案

这绝对是缓冲区问题。当您一次读取一个 block 时,它就会起作用。

func getApplications() -> String?
{
    var retval=""
    let theTask = NSTask()
    let taskOutput = NSPipe()
    theTask.launchPath = "/usr/sbin/system_profiler"
    theTask.standardOutput = taskOutput
    theTask.standardError = taskOutput
    theTask.arguments = ["-xml", "SPApplicationsDataType"]
    theTask.launch()

    while (true) {
        let data = taskOutput.fileHandleForReading.readDataOfLength(1024)
        if (data.length <= 0) { break }
        let str = String(data: data, encoding: NSUTF8StringEncoding)!
        retval += str

        //print (str)
    }

    theTask.waitUntilExit()

    return retval
}

关于swift - NSTask 输出缓冲区大小问题(运行 SPApplicationsDataType 命令),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318612/

相关文章:

ios - PDFKit - 使用 pageViewController 的 PDFView - 滑动到下一页时页面呈现缓慢

swift - 使用 Alamofire 4.0 和 Swfit 3 解析字典数组

ios - supportedInterfaceOrientations 在除 6+ 以外的所有 iPhone 上调用

eclipse - 如何使用 Eclipse 设置 pygame?

macos - 使用 Applescript 退出所有应用程序?

node.js - 你如何解码 Node 中的连续比特流?

java - 如何从java中的文本文件读取数据,条件是数据必须从一个位置读取到另一个位置

ios - 为什么tableview的setSelected(_ :animated:) and setHighlighted(_:animated:) method called on init/load?

swift - 标题顶部的 NSTableView 单元格

node.js - Nodejs中字节转十六进制和十六进制转字节