Чтение живого вывода из сценария оболочки и обновление индикатора выполнения - PullRequest
1 голос
/ 24 августа 2009

У меня есть сценарий оболочки, записывающий список номеров (1, 2 и т. Д., По одному в строке) в файл журнала. Мне нужно, чтобы приложение ObjC считывало файл журнала каждые X секунд, а затем обновлял индикатор выполнения в соответствии с последним номером, зарегистрированным в файле журнала.

Какой лучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 24 августа 2009

Почему бы не использовать взамен NSFileHandle readInBackgroundAndNotify? Таким образом, ваш код запускается только тогда, когда что-то действительно происходит в файле.

0 голосов
/ 24 августа 2009

Вы можете создать экземпляр NSTimer и заставить его каждые X секунд вызывать другой метод, который отвечает за чтение файла и обновление индикатора выполнения. Этот метод может использовать stringWithContentsOfFile: NSString, чтобы прочитать файл в строку, а затем проанализировать его соответствующим образом.

Например:

// Create the invocation of the method to call
NSUInteger X = 2; // Change depending on how often you want the timer fired
NSMethodSignature *signature = [self methodSignatureForSelector:@selector(read)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

// Create the timer, adding it to the default run loop
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:X
                                              invocation:invocation
                                                 repeats:YES];

И позже вы определяете селектор read:

- (void)read {
    NSString *fileContents = [NSString stringWithContentsOfFile:@"aFile.txt"];
    NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
    NSString *lastLine = [lines lastObject];

    // Your own parsing and updating code here
}

Если вам нужна определенная точка остановки, вы можете сохранить timer в иваре внутри вашего класса, а затем вызывать [timer invalidate]; всякий раз, когда ваш код синтаксического анализа внутри read определяет, что вы закончили с любым выполняемым процессом.

Соответствующие документы:

...