我在这个问题上挣扎了很长时间。
我正在使用 与其他程序通信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];
});
});