2015-05-23 102 views
1

我在我的OS X應用程序內啓動了一些交互式過程我希望能夠讀取和寫入管道。使用NSPipe交互式命令

例如:啓動進程將等待用戶鍵入命令。當用戶完成(又名按下輸入)時,進程將返回一些內容,然後再等待用戶。

現在,我使用NSPipe類通信,但問題是,當方法writeData:被調用時,我要叫closeFile爲了得到通知NSFileHandleDataAvailableNotification

完整代碼(具有文件夾路徑)是該

dispatch_queue_t taskQueue = 
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
    dispatch_async(taskQueue, ^{ 

    task = [[NSTask alloc] init]; 
    [task setStandardOutput: [NSPipe pipe]]; 
    [task setStandardInput: [NSPipe pipe]]; 
    [task setStandardError: [task standardOutput]]; 
    [task setLaunchPath: @"/Users/..."]; 
    [task setArguments:@[@"--interaction"]]; 

    [[[task standardOutput] fileHandleForReading] waitForDataInBackgroundAndNotify]; 

    [[NSNotificationCenter defaultCenter] 
     addObserverForName:NSFileHandleDataAvailableNotification 
        object:[[task standardOutput] fileHandleForReading] 
        queue:nil 
       usingBlock:^(NSNotification *notification){ 
     NSData *output = [[[task standardOutput] fileHandleForReading] availableData]; 
     NSString *outStr = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      NSLog(@"avaliable data: %@", outStr); 
      NSString * message = @"IOTCM \"/Users/.../Demo.agda\" None Indirect (Cmd_show_version)"; 
      [[[task standardInput] fileHandleForWriting] 
        writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; 
     }); 
     [[[task standardOutput] fileHandleForReading] waitForDataInBackgroundAndNotify]; 
    }]; 

    [task launch]; 
    [task waitUntilExit]; 
}); 

注意,我得到的第一份通知(處理響應),但沒有通知來writeData:被調用後。

如何實現通信,即:

  1. 被推出(並保持通過應用程序生命週期啓動)

  2. 寫入和讀取支持

+1

你不需要在命令結尾處換行嗎? – Droppy

+0

也許?如果這樣做會嘗試接受。我會給你買一瓶啤酒,如果這有效的話:)謝謝! – markich

+0

如果你住在德國,那麼我會咬你的手爲啤酒;-) – Droppy

回答

1

您需要添加一個換行發送到管道的任何命令,就像交互式一樣。 Newlines刷新流緩衝區,通常是命令的「go」部分。

但是,我找不到任何參考來重新執行此答案。