パイプから読み書きできるようにしたいOS Xアプリ内でインタラクティブなプロセスを起動しています。
例: プロセスの起動は、ユーザーがコマンドを入力するのを待ちます。ユーザーが終了すると (エンターが押されると)、プロセスは何かを返し、再びユーザーを待ちます。
今のところ、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:
受け取りますが、呼び出された後に通知が来ないことに注意してください。
コミュニケーションを達成する方法。
ローンチされる (そして、アプリのライフサイクルを通じてローンチされたままになる)
書き込みと読み取りがサポートされています