2010-07-26 5 views
0

내 질문은 네트워크 통신이 iOS 플랫폼의 다른 스레드에서 어떻게 수행되는지에 대한 무지에서 비롯된 것 같습니다. 프린터에 대한 입출력 스트림 래퍼 인 TcpConnection 클래스가 있습니다. Open 호출은 다음과 같습니다다른 스레드에서 간단한 아이폰 네트워킹

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) ipAddress, port, &readStream, &writeStream);  
    self.myInputStream = (NSInputStream*)readStream; 
    self.myOutputStream = (NSOutputStream*)writeStream; 

    CFRelease(readStream); 
    CFRelease(writeStream); 

    [self.myInputStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket]; 
    [self.myInputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.myInputStream open]; 

    [self.myOutputStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket]; 
    [self.myOutputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.myOutputStream open]; 

문제는 [NSRunLoop currentRunLoop] 호출입니다. 메인 스레드 (detachNewThreadSelector 사용)가 아닌 스레드에서이 TcpConnection 객체를 만들면 해당 스레드에서 해당 연결과 만 통신 할 수 있습니다. 주 스레드로 돌아가거나 다른 스레드로 전달하려고하면 다시 데이터를 가져올 수 없습니다.

그러나 입/출력 스트림을 mainRunLoop에서 예약하면 올바르게 작동합니다. 하지만 그건 내 바지가 무서워. 나는 그것이 무엇을 할 것인지 모른다. 모든 스트림 통신이 메인 스레드에서 수행된다는 의미입니까? 다른 성능 문제가 있습니까? 네트워크 통신이 예정된 예제를 찾지 못했습니다. mainRunLoop; 그 일을해서는 안된다는 뜻인가요? 여러 개의 스레드에서 내 TcpConnection과 대화하려고 할 때 스레드를 잘못 사용하고 있습니까?

나는 Threading Programming Guide을 읽었지만이 문제를 해결하지 못했습니다. 도움이 되셨을 것입니다.

답변

1

메인 실행 루프를 예약하면 스트림에 주 스레드에서 대리자 콜백을 수행하도록 알리는 것입니다. 스트림 콜백의 작동 방식에 따라 문제가 될 수도 있고 아닐 수도 있습니다.

스레드간에 연결 개체를 전달하려고하면 디자인 냄새가 난다고합니다. 내가 권하는 것은 자체 실행 루프를 실행하는 하나의 오래 지속되는 연결 스레드를 갖는 것입니다. 해당 스레드의 실행 루프에서 스트림을 예약 한 다음 해당 스레드와 다른 스레드간에 메시지를 전달하여 네트워크에서 데이터를 껐다가 다시 섞습니다. 이렇게하면 네트워크 통신을 단일 스레드/실행 루프에 알맞게 지역화 할 수 있습니다.

관련 문제