私は Objective-C を初めて使用するので、何かが足りない場合はご容赦ください。しかし、私たちはどこかから始めなければなりません:)
コマンドを実行し、結果を別のメソッドに渡す別のオープン ソース プロジェクトから取得したコード スニペットがあります。私がする必要があるのは、標準出力に出力される新しい行ごとにリッスンし、各行で何かを行うことです。
私が取り組んでいるコードスニペットは次のとおりです。
NSMutableArray *args = [NSMutableArray array];
NSString *input = [details valueForKey:@"input"];
for (NSString *i in [input componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]) {
[args addObject:i];
}
NSTask *scriptTask = [NSTask new];
NSPipe *outputPipe = [NSPipe pipe];
if ([_NSFileManager() isExecutableFileAtPath:scriptPath] == NO) {
NSArray *chmodArguments = @[@"+x", scriptPath];
NSTask *chmod = [NSTask launchedTaskWithLaunchPath:@"/bin/chmod" arguments:chmodArguments];
[chmod waitUntilExit];
}
[scriptTask setStandardOutput:outputPipe];
[scriptTask setLaunchPath:scriptPath];
[scriptTask setArguments:args];
NSFileHandle *filehandle = [outputPipe fileHandleForReading];
[scriptTask launch];
[scriptTask waitUntilExit];
NSData *outputData = [filehandle readDataToEndOfFile];
NSString *outputString = [NSString stringWithData:outputData encoding:NSUTF8StringEncoding];
if (NSObjectIsNotEmpty(outputString)) {
[self.world.iomt inputText:outputString command:IRCPrivateCommandIndex("privmsg")];
}
したがって、プロセスが完了するのを待ってから結果を処理するのではなく、コマンドによって標準出力に出力される新しい行ごとに待機する必要があります。
私のバックグラウンドは主に Web 開発者なので、Node.js とイベント エミッターを使用している場合、私の目的は次のようになると思います。
task = new Task("ls");
task.addListener("newline", function(data) {
somethingElse("sendmsg", data);
});
task.run();
私が達成しようとしていることを理解していただければ幸いです。ありがとう!