2012-05-24 5 views
0

소스가없는 제 3 자 프레임 워크를 사용하고 있습니다 (사용이 필요합니다). 타사 프레임 워크는 인증 된 클라이언트/서버 연결 만들기를 처리하고 열린 NSStream 쌍을 반환합니다. 내가 가지고있는 과제는 NSStream이 주 스레드에서 예약된다는 것입니다 (UI가 응답하지 않을 수있는 상황을 만듭니다 - 나는 피하고 싶습니다).주 스레드에서 예약 된 열려 있지만 비활성 상태의 NSStream을 다른 스레드로 이동할 수 있습니까?

스트림이 제 3 자 프레임 워크에서 전달 될 때 네트워크 트래픽이 진행되지 않습니다. 그래서 NSStream을 스케줄을 취소하고 재 스케줄링 할 수 있는지 궁금합니다.

열려있는 NSStream의 스케줄을 취소하고 다른 스레드의 다른 실행 루프에서 일정을 다시 잡을 수 있다면 누구에게 알 수 있습니까? 그게 문제를 일으킬까요? 거기에 어떤 코드 예제가 있습니까?

미리 감사드립니다.

아론

+0

실제로 스레드에서 일정을 예약하고 있습니까? 방금 차단하는 경우 함수 호출에 NSInvocationOperation을 사용하여 차단하지 않도록 할 수 있습니다. – heckman

+0

@heckman 나는 당신의 질문을 이해하고 있는지 확신하지 못합니다. NSInputStream과 NSOutputStream을 받고 있습니다. 둘 다 NSStreamStatusOpen 상태를받습니다. 전송하기 시작할 때까지 스트림에 트래픽이 없으므로 효과적으로 스테이 시스 상태에 있습니다. 주 스레드에 있기 때문에 대리인 메시지를 받거나 서비스 할 때 차단 상황이 발생합니다. – xyzzycoder

+0

아래의 응답을 참조하십시오. – heckman

답변

0

내가 제대로 응용 프로그램을 이해한다면, 그것은 당신의 응용 프로그램이 특정 스트림에 대한 참조를 수신하고 스팀에 모든 것을 읽을 담당하고 있음을 의미한다. 이러한 스트림을 읽는 것은 NSThread, NSOperation 또는 다른 스레딩 메커니즘을 통해 응용 프로그램의 배경으로 강제해야합니다.

예 :

에서 어떤 파일이 NSInputStream에 묶는 것을 :

(void)readAndStoreInput:(NSInputSteam*) input{ 
    //process your input steam into your system in the background 

} 

이 얼마나 당신이 것에 대한 간단한 예입니다 : 당신의 독자가 같은 것을

@property (strong, nonatomic) NSInvocationOperation *parseOp; 

(id)startInputRead:(NSInputStream *)input { 
    if([input hasBytesAvailable]) { 
     self.parseOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(readAndStoreInput:) object:inputStream]; 

    } 

입니다 입력면에 대해 이렇게하십시오. 유사한 방식으로 출력 증기에 대한 작업을 대기시킬 수도 있습니다. 이렇게하면 모든 것이 동시에 실행되고 앱이 응답을 유지해야합니다.

+0

안녕하세요. 그러나 Apple의 문서에 따르면 "스트림의 실행 루프를 소유 한 스레드와 다른 스레드에서 예약 된 스트림에 액세스하려고 시도하면 안됩니다." https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html#//apple_ref/doc/uid/20002273-BCIJHAGD – xyzzycoder

+0

이 응답의 코드는 NSStream이 어디서 읽혔는지에 관해서는 스레드에 무관심해야합니다. 애플의 문서는 이것이 노 - 노 (no-no)라고 꽤 분명하게 보인다. – xyzzycoder

+0

@xyzzycoder 당신은 scheduleInRun 루프를 수행하고 있습니까? 백그라운드 서브 프로세스에 목록 1의 모든 코드를 넣을 수있는 이유가 없습니다. – heckman