Получение данных из NSTask в реальном времени с использованием уведомлений не работает

У меня есть программа командной строки Какао, в которой я пытаюсь запустить программу NSTask ( tshark для мониторинга сети) и получить от нее данные в реальном времени. время. Так что я делаю NSFileHandle , вызовите waitForDataInBackgroundAndNotify для отправки уведомлений, а затем зарегистрируйте мой класс справки в Центре уведомлений для обработки данных, но в мой класс справки не отправляется ни одного уведомления.

Кто-нибудь знает, что может быть не так?

Заранее спасибо

Вот мой код:

#import <Foundation/Foundation.h>
#import <string>
#import <iostream>

@interface toff : NSObject {}
-(void) process:(NSNotification*)notification;
@end

@implementation toff
-(void) process:(NSNotification*)notification{
    printf("Packet caught!\n");
}
@end

int main (int argc, const char * argv[]){
    @autoreleasepool {
        NSTask* tshark = [[NSTask alloc] init];
        NSPipe* p = [NSPipe pipe];
        NSFileHandle* read = [p fileHandleForReading];
        toff* t1 = [[toff alloc] init];
        NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];

        [read waitForDataInBackgroundAndNotify];
        [nc addObserver:t1 selector:@selector(process:) name:nil object:nil];

        printf("Type 'stop' to stop monitoring network traffic.\n");
        [tshark setLaunchPath:@"/usr/local/bin/tshark"];
        [tshark setStandardOutput:p];
        [tshark launch];

        while(1){
            std::string buffer;
            getline(std::cin, buffer);
            if(buffer.empty()) continue;
            else if(buffer.compare("stop") == 0){
                [tshark interrupt];
                break;
            }
        }

        //NSData* dataRead = [read readDataToEndOfFile];
        //NSLog(@"Data: %@", dataRead);
        //NSString* stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
        //NSLog(@"Output: %@", stringRead);

    }
    return 0;
}

РЕДАКТИРОВАТЬ: Когда я раскомментирую закомментированный участок кода и удаляю все эти уведомления, все необходимые данные извлекаются из дескриптора файла после завершения задачи.

Мне также было интересно, если проблема не может быть в том, что моя программа является «инструментом командной строки», поэтому я не уверен, есть ли у нее цикл выполнения - как сказано в документации Apple (в сообщении waitForDataInBackgroundAndNotify NSFileHandle) :

Вы должны вызывать этот метод из потока, у которого есть активный цикл выполнения.

9
задан PhoenixS 23 January 2012 в 08:51
поделиться