1

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];
    }
}
Sugite
  • 41
  • 4
  • Add an observer for `NSTaskDidTerminateNotification` and call `readDataToEndOfFile`. You don't have to call `[fh closeFile]`. – Willeke Dec 01 '16 at 15:55
  • @Willeke `NSTaskDidTerminateNotification ` also does not work, the `receivedData:` method does not be invoked – Sugite Dec 05 '16 at 03:44

0 Answers0