iOS中多个输入流的多个线程

时间:2014-05-15 22:32:38

标签: multithreading networking ios7 xcode5

我的iOS应用需要连接多台服务器,最多五台。当我顺序连接时,它很慢,因为服务器对初始数据查询的响应大约需要三秒钟。但是,如果我打开同时连接,响应会混合在一起,因为它们分别在第二部分末尾的CRLF中分为两部分。通过两个连接,我最终得到两个输入:partApartApartB和partB。

创建时,侦听器将添加到运行循环中。他们可以被分成不同的线程吗?如果是这样,听众是否会彼此隔离,因此来自多个输入流的数据不会混合?

我使用的代码很常见。我的流监听器是:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {

    switch (streamEvent) {

        case NSStreamEventOpenCompleted:
            break;

        case NSStreamEventHasBytesAvailable:
            if (theStream == self.inputStream) {
                uint8_t buffer[1024];
                int len;

                while ([self.inputStream hasBytesAvailable]) {
                    len = [self.inputStream read:buffer maxLength:sizeof(buffer)];
                    if (len > 0) {

                        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
                        self->recieved = [self->recieved stringByAppendingString:output];

                        if (nil != output && [self->recieved hasSuffix:@"->"]) {
                            [self messageReceived:recieved];
                            recieved = @"";
                        }
                    }
                }
            }
            break;

        case NSStreamEventErrorOccurred:
            break;

        case NSStreamEventEndEncountered:
            [self close];
            break;

        case NSStreamEventHasSpaceAvailable:
            break;

        default:
            break;
    } // end switch

}

1 个答案:

答案 0 :(得分:0)

我找到了一个简单的解决方案。通过将每个流放入新类的单独实例中,两个输入流彼此隔离。我之前使用了几个变量来将所有流保存在一个类中,这个方法在我的其他环境中有效,但在iOS中却没有。