내 질문은 네트워크 통신이 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을 읽었지만이 문제를 해결하지 못했습니다. 도움이 되셨을 것입니다.