Простая сеть iphone в разных темах - PullRequest
0 голосов
/ 26 июля 2010

Полагаю, мой вопрос связан с незнанием того, как осуществляется сетевое взаимодействие в разных потоках на платформе 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 из нескольких потоков?

Я прочитал Руководство по программированию потоков , но, похоже, оно не решает эту проблему.Любая помощь будет оценена

1 Ответ

1 голос
/ 26 июля 2010

Планируя основной цикл выполнения, вы указываете потокам выполнять их обратные вызовы делегатов в основном потоке. Это может или не может быть проблемой, в зависимости от того, как ведут себя обратные вызовы вашего потока.

Я бы сказал, что попытка передать объекты соединения между потоками - это запах проекта. Я бы порекомендовал иметь один долгоживущий поток соединений, который запускает свой собственный цикл выполнения. Запланируйте свои потоки в цикле выполнения этого потока, затем передавайте сообщения между ним и другими потоками, чтобы перетасовать данные в сеть или из нее. Это обеспечит правильную локализацию сетевого взаимодействия в одном потоке / цикле выполнения.

...