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:
被調用後。
如何實現通信,即:
被推出(並保持通過應用程序生命週期啓動)
寫入和讀取支持
你不需要在命令結尾處換行嗎? – Droppy
也許?如果這樣做會嘗試接受。我會給你買一瓶啤酒,如果這有效的話:)謝謝! – markich
如果你住在德國,那麼我會咬你的手爲啤酒;-) – Droppy