0

所以,我设法让 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放在像 AppDelegate 这样更“全局”的地方application didFinishLaunchingWithOptions,然后处理数据并更新另一个类中的多个视图?我试过了,当然我可以在 AppDelegate 里面装东西log.text = new_input,因为它来自另一个类,包括它并不能解决问题。

正如您可能注意到的,我对将其发送到 AppStore 不感兴趣。这是一个供我自己在越狱的 iPhone 上使用的应用程序。谢谢你。

4

2 回答 2

1

快速的方法是

在您希望收到此相同通知的所有视图中,添加以下内容

接收视图

-(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]
}
于 2012-06-02T19:31:47.733 回答
0

小心,new_input 已分配但未释放 => 内存泄漏

于 2012-06-02T19:36:16.800 回答