Objective-C: несколько представлений и данные, поступающие из NSTask

Итак, мне удалось заставить NSTask асинхронно читать из программы, но я сделал это внутри класса UIView в своей раскадровке. (Не эксперт по Obj-C)

Моя идея такова: я читаю текст из программы, помещаю его в UITextView, а затем, когда появляется больше, повторяю процесс через NSNotificationCenter

Пока это мой код:

LView.m:

- (void)viewDidLoad
{

    [super viewDidLoad];

    NSPipe *out_pipe = [NSPipe pipe];
    sshoutput = [out_pipe fileHandleForReading];
    [sshoutput readInBackgroundAndNotify];

    utilT = [[NSTask alloc] init];
    [utilT setLaunchPath:@"/usr/bin/utilfc9"];
    [utilT setArguments:[NSArray arrayWithObjects: @"-p", @"-f", @"log.txt", nil]];

    [utilT setStandardOutput: out_pipe];
    [utilT setStandardError: out_pipe];
    [utilT launch];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readPipe:) name:NSFileHandleReadCompletionNotification object:nil];
}

-(void)readPipe: (NSNotification *)notification
{
    NSData *data;
    NSString *new_input;

    if( [notification object] != sshoutput ) { return };

    data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
    new_input = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    self.log.text = [self.wifilog.text stringByAppendingFormat: @"\n%@", new_input];

    if( utilT ) {
        [sshoutput readInBackgroundAndNotify];
    }
}

LView.h:

#import <UIKit/UIKit.h>
#import "NSTask.h"

NSTask *sshT;
NSFileHandle *sshoutput;

Пока все работает отлично, я получаю данные в реальном времени без каких-либо проблем.

Но как я могу поместить этот NSTask в более «глобальное» место, такое как application didFinishLaunchingWithOptions AppDelegate, а затем обработать данные и обновить несколько представлений в других классах? Я пробовал и конечно могу напихать вроде log.text = new_input внутри AppDelegate потому что он из другого класса и включение его не решает проблему.

Как вы могли заметить, я не заинтересован в отправке этого в AppStore. Это приложение для меня, которое я использую на взломанном iPhone. Спасибо.


person TCB13    schedule 02.06.2012    source источник


Ответы (2)


Быстрый способ сделать это

Во всех представлениях, которые вы хотите получить, добавьте одно и то же уведомление:

ReceiverView

-(void) viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(read:)     name:@"ReadTest" object:nil];
}

//read function
-(void) read:(NSNotification*)notification
{ // Do something with the notification }

Сейчас в LView.m

-(void)readPipe: (NSNotification *)notification
{
    NSData *data;
    NSString *new_input;

    if( [notification object] != sshoutput ) { return };

    data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
    new_input = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    self.log.text = [self.wifilog.text stringByAppendingFormat: @"\n%@", new_input];

    if( utilT ) {
        [sshoutput readInBackgroundAndNotify];
    }
    //Add the following
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ReadTest" object:notification]
}
person Omar Abdelhafith    schedule 02.06.2012
comment
Это работает, я получаю уведомления, но я заметил, что для этого мне нужно открыть ReceiverView, чтобы произошло ViewDidLoad. Как я могу сделать это программно? Спасибо. - person TCB13; 02.06.2012
comment
Переместите [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(read:) name:@ReadTest object:nil]; к функции init{, также не забудьте принять ответ :) - person Omar Abdelhafith; 02.06.2012
comment
Мне удалось решить ее, поставив -(void)awakeFromNib { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(read:) name:@"NewData" object:nil]; } Спасибо за все! - person TCB13; 03.06.2012

Будьте осторожны, new_input выделяется, но не освобождается => утечка памяти

person Elfoiros    schedule 02.06.2012
comment
Я использую автоматический подсчет ссылок, поэтому... нет необходимости выпускать new_input. В любом случае, спасибо. - person TCB13; 02.06.2012