我正在使用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中运行应用程序时打印出来的内容,并将其放入文本视图中。有没有办法做到这一点?
4条答案
按热度按时间xqnpmsa81#
从macOS 10.7开始,
NSPipe
上还有readabilityHandler
属性,您可以使用它来设置新数据可用时的回调:我很惊讶没有人提到这一点,因为这是一个非常简单的。
ax6ht2ek2#
您可以使用通知从管道中异步读取。下面是一个简单的示例,演示了它是如何工作的,希望这能帮助您入门:
代替
print("got output: \(str)")
,您可以将接收到的字符串附加到文本视图中。上面的代码假设runloop是活动的(这是默认可可应用程序中的情况)。
6tqwzwtp3#
这是Martin在最新版本Swift上的回答的更新版本。
ac1kyiln4#
我有一个答案,我相信它比通知方法更干净,基于readabilityHandler。在Swift 5中,它是:
请注意,Process必须是一个属性,因为在上面的例子中,假设命令是在后台执行的,如果它是一个局部变量,那么进程将立即被释放。感谢您的关注。