Полагаю, мой вопрос связан с незнанием того, как осуществляется сетевое взаимодействие в разных потоках на платформе 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]
.Когда я создаю этот объект TcpConnection в потоке, который не является основным потоком (используя detachNewThreadSelector
), я могу общаться только с этим соединением в этом потоке.Если я попытаюсь вернуться к основному потоку или передать его другому потоку, я не смогу получить никаких данных обратно.
Если, однако, я планирую потоки ввода / вывода в mainRunLoop
, он работает нормально.Но это пугает меня.Я не знаю, что это будет делать.Означает ли это, что все потоковые коммуникации выполняются в основном потоке?Есть ли другие проблемы с производительностью?Я не нашел примеров, когда сетевые коммуникации запланированы на mainRunLoop
;это значит, что я не должен этого делать?Неправильно ли я использую потоки, когда пытаюсь общаться с моим TcpConnection
из нескольких потоков?
Я прочитал Руководство по программированию потоков , но, похоже, оно не решает эту проблему.Любая помощь будет оценена