gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:03 25 4
gpt4 key购买 nike

尝试从系统分析器中读取一些信息。为此,我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com