나는 쉘 명령을 실행하고 NSPipe를 통해 데이터를 출력하기 위해 NSTask를 사용한다. 처음에는 출력 데이터를 읽기 위해 벨로우 (bellow) 메서드를 사용했지만 아무런 문제가 없습니다.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
이 내가 원하는 것임을 보장하지만, 마지막 데이터 청크를 추가 한 후에는 차단하고있다. 몇 가지 해결책을 제공해 주시겠습니까? 감사.
정말 이해가 가지 않습니다. 죄송합니다. 코드를 보여줄 수 있습니까? 고맙습니다. –
'while'루프는 추가 알림을 보내줍니다. 그러나 while 루프는 청크에 의해 모든 데이터 청크를받습니다. 즉, 데이터는 while 루프에 의해 완전히 수신됩니다. 블로킹은 마지막 청크 데이터 (<4096 바이트)를 수신 한 후에 만 발생합니다. –
@bbbum, 도와 주셔서 감사합니다. 이제 그 이유를 알았어. 안타깝게도 내 앱이 쉘과 상호 작용하기를 원하기 때문에 백그라운드 작업을 종료 할 수 없습니다 (예 : sh를 실행하고 파이프를 통해 명령을 입력). 두 번째 방법은 데이터 볼륨을 감지 할시기와 방법을 알지 못합니다. 문제의 해결책에 대해 이야기 한 [예제] (http://dev.notoptimal.net/2007/04/nstasks-nspipes-and-deadlocks-when.html)를 찾았지만, 그것은 나에게 유효하지 않습니다. 네 도움이 더 필요해. 다시 한번 감사드립니다. –