后台线程中的NSInputStream不会调用NSStreamEventHasBytesAvailable

时间:2011-12-24 09:55:55

标签: objective-c nsthread cfnetwork nsinputstream nsoutputstream

我正在开发部分应用程序。我需要在使用NSinputstream和NSOutputstream的后台线程上放置流处理。 然后我在同一个线程上通过此流媒体通道发送http命令。 我收到了NSStreamEventOpenCompleted和NSStreamEventHasSpaceAvailable,并且我在服务器端收到了http请求,但它没有提高EVENT HAS BYTES AVAILABLE。我无法收到回复......我不知道是什么问题。这是我的代码的一部分:

我正在使用的主题:

- (void)backgroundThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSLock *threadLock = [[NSLock alloc] init];
while (quitProcess)
{
    if (queue.count > 0)
    {
        [threadLock lock];// Blocks other threads
        cmdQueue = [queue copy];
        [queue removeAllObjects];
        [threadLock unlock];
    }
    else
    {
        sleep(1);
    }

    if (cmdQueue){
        for (NSString* cmd in cmdQueue) 
        {

            if ([cmd isEqualToString:@"subscribe"]){
                [self openCmdLine];
            }else if ([cmd isEqualToString:@"dataConnect"]){
                [self dataConnect];
            }else if ([cmd isEqualToString:@"openCmdLine"]){
                [self openCmdLine];
            }else if ([cmd isEqualToString:@"closeCmdLine"]){
                [self closeCmdLine];
            }else if ([cmd isEqualToString:@"handshake"]){
                sleep(5);
                [self cmdHandshake];
            }else if ([cmd isEqualToString:@"topvol"]){
                [self cmdTopVol];
            }else{
                //subscribe or unsubscribe

            }

        }
        cmdQueue = nil;
    }


   }
   [pool drain];
}

1 个答案:

答案 0 :(得分:1)

原因是因为NSRunloop负责连接回调,你应该把它放在你的代码中