Итак, мне удалось заставить 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. Спасибо.