我使用 NSTask 运行 shell 命令并通过 NSPipe 输出数据。起初,我使用波纹管方法读取输出数据,没有任何问题。
- (void)outputAvailable:(NSNotification *)aNotification {
NSString *newOutput;
NSMutableData *allData = [[NSMutableData alloc] init];
NSData *taskData = nil;
if((taskData = [readHandle availableData]) && [taskData length])
newOutput = [[NSString alloc] initWithData:allData encoding:NSASCIIStringEncoding];
NSLog(@"%@", newOutput);
[readHandle readInBackgroundAndNotify];
}
该方法的问题是它只输出 4096 字节的数据。所以我使用while
循环来获取更多数据,修改方法如下:</p>
- (void)outputAvailable:(NSNotification *)aNotification {
NSString *newOutput;
NSMutableData *allData; //Added.
NSData *taskData = nil;
while ((taskData = [readHandle availableData]) && [taskData length]) {
[allData appendData:taskData];
}
newOutput = [[NSString alloc] initWithData:allData encoding:NSASCIIStringEncoding];
NSLog(@"%@", newOutput);
[readHandle readInBackgroundAndNotify];
}
那么问题就出现了:程序阻塞在while
循环中,不能执行下面的语句。我确保这allData
是我想要的,但是在附加最后一个数据块之后,它被阻塞了。你能给我一些解决方案吗?谢谢。