2010-07-26 50 views
0

我想我的问题源于对iOS平台上不同线程上的网络通信如何完成的无知。我有一个TcpConnection类,它是打印机的输入和输出流的包装。在Open调用看起来是这样的:简单的iphone网络在不同的线程

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对话时,我是否正确使用线程?

我看了Threading Programming Guide,但似乎没有解决这个问题。 任何帮助,将不胜感激

回答

1

通过调度主运行循环,你告诉流在主线程上执行其委托回调。这可能会也可能不会成为问题,具体取决于您的流回调的行为方式。

我会说,试图传递线程之间的连接对象是一种设计气味。我会推荐的是拥有一个运行自己的运行循环的单一,长寿命的连接线程。在该线程的运行循环中安排您的流,然后在它与其他线程之间传递消息以将数据混合到网络上或从网络中移出。这将使您的网络通信很好地局限于单个线程/运行循环。