2014-12-16 3 views
0

У меня есть следующий код Obj-C и его вывод журнала. Может ли кто-нибудь сказать мне, почему я не получаю никакого результата от NSFileHandle?echo не работает с NSTask и readInBackgroundAndNotify

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    [self performSelectorInBackground:@selector(startTask:) withObject:nil]; 
} 

- (void) startTask: (id) sender 
{ 
    NSPipe *pipe = [[NSPipe alloc] init]; 
    NSFileHandle *fh = pipe.fileHandleForReading; 

    [fh readInBackgroundAndNotify]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(output:) name:NSFileHandleReadCompletionNotification object:fh]; 

    NSTask *echoTask = [[NSTask alloc] init]; 

    echoTask.standardOutput = pipe; 
    echoTask.standardError = [[NSPipe alloc] init]; 
    echoTask.launchPath = @"/bin/echo"; 
    echoTask.arguments = @[@"hello world!"]; 

    NSLog(@"launching..."); 
    [echoTask launch]; 
    [echoTask waitUntilExit]; 
    NSLog(@"finished."); 
} 

- (void) output:(NSNotification *)notification 
{ 
    NSFileHandle *fh = notification.object; 
    NSLog(@"fh: %@", fh); 

    NSString *output = [[NSString alloc] initWithData:[fh readDataToEndOfFile] encoding:NSUTF8StringEncoding]; 

    NSLog(@"output: '%@'", output); 
} 

@end 

журнала:

2014-12-16 10:19:58.154 SubProcess2[14893:704393] launching... 
2014-12-16 10:19:58.165 SubProcess2[14893:704393] fh: <NSConcreteFileHandle: 0x6080000e9e80> 
2014-12-16 10:19:58.165 SubProcess2[14893:704393] output: '' 
2014-12-16 10:19:58.166 SubProcess2[14893:704393] finished. 

Если я это делать синхронно или с использованием подхода в https://stackoverflow.com/a/16274541/1015200 я мог заставить его работать. Произошли какие-либо другие методы и варианты (например, запуск задачи без выполнения функцииSelectorInBackground). Я действительно хочу посмотреть, смогу ли я заставить его работать с помощью уведомления. Так что если я могу получить любую помощь, это будет здорово.

ответ

1

Данные, которые уже были прочитаны, передаются в уведомление в словаре userInfo под ключом NSFileHandleNotificationDataItem, вы должны получить доступ к этому и не пытаться читать дополнительные данные. Например. что-то вроде:

- (void) output:(NSNotification *)notification 
{ 
    NSString *output = [[NSString alloc] 
         initWithData:notification.userInfo[NSFileHandleNotificationDataItem] 
          encoding:NSUTF8StringEncoding]; 

    NSLog(@"output: '%@'", output); 
} 

HTH

+0

Работал отлично, спасибо! –

Смежные вопросы