I want to get output of a NSTask. When the output format is Text, it is full. But when the output format is XML, it is truncated.
Text format:
NSMutableArray *cmdStrings = [[NSMutableArray alloc] initWithArray:@[@"pmd", @"cpd", @"--language", language, @"--minimum-tokens", tokenString]];
[self.projectsDirectoryList enumerateObjectsUsingBlock:^(NSString *url, NSUInteger idx, BOOL * _Nonnull stop) {
[cmdStrings addObject:@"--files"];
[cmdStrings addObject:url];
}];
XML format:
NSMutableArray *cmdStrings = [[NSMutableArray alloc] initWithArray:@[@"pmd", @"cpd", @"--language", language, @"--minimum-tokens", tokenString]];
[self.projectsDirectoryList enumerateObjectsUsingBlock:^(NSString *url, NSUInteger idx, BOOL * _Nonnull stop) {
[cmdStrings addObject:@"--files"];
[cmdStrings addObject:url];
}];
if ([format isEqualToString:@"XML"]) {
[cmdStrings addObject:@"--format"];
[cmdStrings addObject:@"xml"];
}
launch NSTask:
- (void)launch:(NSArray *)args {
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithArray:args]];
NSPipe *outputPipe = [NSPipe pipe];
[task setStandardOutput:outputPipe];
NSFileHandle *fh = [outputPipe fileHandleForReading];
[fh waitForDataInBackgroundAndNotify];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedData:) name:NSFileHandleDataAvailableNotification object:fh];
[task launch];
}
- (void)receivedData:(NSNotification *)notif {
NSFileHandle *fh = [notif object];
NSData *data = [fh availableData];
if (data.length > 0) {
[fh waitForDataInBackgroundAndNotify];
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@\n%ld" ,str, str.length);
} else {
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSFileHandleDataAvailableNotification object:fh];
[fh closeFile];
}
}