我很长时间都在努力解决这个问题。
我正在使用NSPipe
与其他程序进行通信,一切正常,除非我收到通知NSFileHandleDataAvailableNotification
,否则我无法获得所有数据。
到目前为止,我发现管道的读取部分确实收到数据可用的通知,但它还没有完全完成(写入)。如果我在通知后立即阅读,我只会得到部分回复。但是如果我将线程设置为休眠例如0.1秒然后读取,则一切正常。
有没有办法确定,我会从管道得到完整的回复?
到目前为止,我有:
inputPipe = [NSPipe pipe];
outputPipe = [NSPipe pipe];
fileReading = inputPipe.fileHandleForReading;
[fileReading waitForDataInBackgroundAndNotify];
fileWriting = outputPipe.fileHandleForWriting;
task = [NSTask new];
task.launchPath = ... launch path
task.arguments = @[@"arg1"];
task.standardInput = outputPipe;
task.standardOutput = inputPipe;
[task launch];
当然会设置通知观察员。它的选择器是:
- (void) dataAvailabe:(NSNotification *) notification {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[NSThread sleepForTimeInterval:0.1];
dispatch_async(dispatch_get_main_queue(), ^{
NSData *data = [fileReading availableData];
NSString * reply = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
});
});