0

私は次のように NSTask の stdout を読んでいます:

NSPipe *outputpipe = [[NSPipe alloc] init];
NSFileHandle *output = [outputpipe fileHandleForReading];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedOutputFromAlgo:) name:NSFileHandleReadCompletionNotification object:output];

NSTask* task = [[NSTask alloc] init];
[task setLaunchPath:[NSString stringWithFormat:@"%@algo/Algo", kVinylRoot]];
[task setArguments:[NSArray arrayWithObject:plist]];
[task setStandardOutput:outputpipe];
[task setCurrentDirectoryPath:[NSString stringWithFormat:@"%@algo", kVinylRoot]];

[task launch];
[output readInBackgroundAndNotify];
[task waitUntilExit];

...

-(void)receivedOutputFromAlgo:(NSNotification*)notification {
    [[notification object] readInBackgroundAndNotify];
    NSData* dataOutput = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
    NSString* dataString = [[NSString alloc] initWithData:dataOutput encoding:NSStringEncodingConversionAllowLossy];
    //Do stuff
}

これを Xcode から実行すると問題なく動作します。コンソールに自分のタスクの stdout が表示され、receivedOutputFromAlgo が複数回ヒットします。ただし、アプリをアーカイブして.appパッケージをダブルクリックして実行するか、ターミナルから実行すると機能しません。そこから実行すると、console.appまたはターミナルでタスクstdoutが通過するのをまだ見ることができます。

この時点で標準出力とは見なされませんか? なぜこれがうまくいかないのでしょうか?

編集:リリースで最適化をオフにしようとしましたが、それも機能しませんでした。

4

1 に答える 1

0

次のように、setStandardError を処理する必要があります。

[task setStandardError:outputpipe];
于 2014-09-22T02:37:26.813 に答える