亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用Swift將NSTask實時輸出到NSTextView

使用Swift將NSTask實時輸出到NSTextView

三國紛爭 2019-12-04 15:20:05
我正在使用NSTask運行rsync,并且希望狀態顯示在窗口內滾動視圖的文本視圖中?,F在我有這個:let pipe = NSPipe()task2.standardOutput = pipetask2.launch()let data = pipe.fileHandleForReading.readDataToEndOfFile()let output: String = NSString(data: data, encoding: NSASCIIStringEncoding)! as StringtextView.string = output這就是我有關傳輸的一些統計信息,但是我想實時獲取輸出,例如在Xcode中運行該應用程序并將其放入文本視圖時所打印的內容。有沒有辦法做到這一點?
查看完整描述

3 回答

?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

您可以使用通知從管道異步讀取。這是一個演示其工作原理的簡單示例,希望可以幫助您入門:


let task = NSTask()

task.launchPath = "/bin/sh"

task.arguments = ["-c", "echo 1 ; sleep 1 ; echo 2 ; sleep 1 ; echo 3 ; sleep 1 ; echo 4"]


let pipe = NSPipe()

task.standardOutput = pipe

let outHandle = pipe.fileHandleForReading

outHandle.waitForDataInBackgroundAndNotify()


var obs1 : NSObjectProtocol!

obs1 = NSNotificationCenter.defaultCenter().addObserverForName(NSFileHandleDataAvailableNotification,

    object: outHandle, queue: nil) {  notification -> Void in

        let data = outHandle.availableData

        if data.length > 0 {

            if let str = NSString(data: data, encoding: NSUTF8StringEncoding) {

                print("got output: \(str)")

            }

            outHandle.waitForDataInBackgroundAndNotify()

        } else {

            print("EOF on stdout from process")

            NSNotificationCenter.defaultCenter().removeObserver(obs1)

        }

}


var obs2 : NSObjectProtocol!

obs2 = NSNotificationCenter.defaultCenter().addObserverForName(NSTaskDidTerminateNotification,

    object: task, queue: nil) { notification -> Void in

        print("terminated")

        NSNotificationCenter.defaultCenter().removeObserver(obs2)

}


task.launch()

而是print("got output: \(str)")可以將接收到的字符串附加到文本視圖中。


上面的代碼假定運行循環處于活動狀態(在默認的Cocoa應用程序中就是這種情況)。


查看完整回答
反對 回復 2019-12-04
?
達令說

TA貢獻1821條經驗 獲得超6個贊

從macOS 10.7開始,還有一個readabilityHandler屬性NSPipe,您可以在該屬性上設置何時有新數據可用的回調:


let task = NSTask()


task.launchPath = "/bin/sh"

task.arguments = ["-c", "echo 1 ; sleep 1 ; echo 2 ; sleep 1 ; echo 3 ; sleep 1 ; echo 4"]


let pipe = NSPipe()

task.standardOutput = pipe

let outHandle = pipe.fileHandleForReading


outHandle.readabilityHandler = { pipe in

    if let line = String(data: pipe.availableData, encoding: NSUTF8StringEncoding) {

        // Update your view with the new text here

        print("New ouput: \(line)")

    } else {

        print("Error decoding data: \(pipe.availableData)")

    }

}


task.launch()

我很驚訝沒有人提到這件事,因為它要簡單得多。


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 1026 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號