Я использую NSTask для запуска команды оболочки и вывода данных через NSPipe. Сначала я использовал следующий метод для чтения выходных данных, это не проблема.
- (void)outputAvailable:(NSNotification *)aNotification {
NSString *newOutput;
NSMutableData *allData = [[NSMutableData alloc] init];
NSData *taskData = nil;
if((taskData = [readHandle availableData]) && [taskData length])
newOutput = [[NSString alloc] initWithData:allData encoding:NSASCIIStringEncoding];
NSLog(@"%@", newOutput);
[readHandle readInBackgroundAndNotify];
}
Проблема с этим методом заключается в том, что он выводит только 4096 байт данных. Поэтому я использую цикл while
для получения дополнительных данных, изменяю метод следующим образом:
- (void)outputAvailable:(NSNotification *)aNotification {
NSString *newOutput;
NSMutableData *allData; //Added.
NSData *taskData = nil;
while ((taskData = [readHandle availableData]) && [taskData length]) {
[allData appendData:taskData];
}
newOutput = [[NSString alloc] initWithData:allData encoding:NSASCIIStringEncoding];
NSLog(@"%@", newOutput);
[readHandle readInBackgroundAndNotify];
}
Затем возникает проблема: программа блокируется в цикле while
и не может выполнять следующие операторы. Я уверен, что allData
— это то, что я хотел, но после добавления последнего фрагмента данных он блокируется. Не могли бы вы дать мне несколько решений? Спасибо.