单独线程的套接字通信

时间:2014-04-24 09:50:09

标签: objective-c multithreading sockets

我已经阅读了40页有关线程的内容,但仍然不确定我的情况。 我有一个NSObject,它打开了与设备的套接字连接。此Object处理所有通信,发送和接收消息等。我想,这个东西在单独的线程上工作。我试过这样的事情:

- (IBAction)connect:(id)sender {
SocketConnectionController *sock = [SocketConnectionController new];
[[sock initWithParams:ip.text :port.text.intValue] performSelectorInBackground:@selector(initWithParams::) withObject:nil];
[[SocketConnectionController sharedInstance] sendCommand:GET_ID_STRING];

}

如您所见,我通过使用现有的SocketConnectionController实例发送一些消息,但它并没有发送任何内容。可能有一些了解我的方面。我确信,由于设备上闪烁的灯光,连接处于打开状态。我是否以正确的方式创建了线程?如果是这样,我现在该如何使用它?

1。 UPDATE: 我试过这样的事情:

NSOperationQueue* queue = [NSOperationQueue new];
SocketConnection *sock = [SocketConnection new];
[queue addOperation:sock]; 

但在CPU图中我看到,东西仍然在线程1(mainThread)上运行。 我究竟做错了什么?

2。更新 我发现,输入和输出流所需的运行循环仍然在主线程上运行。

[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

这就是为什么 1的代码。更新无法正常工作。所以我需要创建一个新的Thread,然后为这个线程创建一个新的run循环。 Cocoa-Framework不能像之前的代码(performSelectorInBackground)那样自动完成。

1 个答案:

答案 0 :(得分:2)

我找到了在单独的线程上执行套接字连接的方法:

NSThread * nThread;

- (NSThread *)networkThread {
    nThread = nil;

        nThread =
        [[NSThread alloc] initWithTarget:self
                                selector:@selector(networkThreadMain:)
                                  object:nil];
        [nThread start];

    NSLog(@"thread: %@, debug description: %@", nThread, nThread.debugDescription);
    return nThread;
}


- (void)networkThreadMain:(id)unused {
    do {
            [[NSRunLoop currentRunLoop] run];
    } while (YES);
}

- (void)scheduleInCurrentThread:(id)unused
{
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                           forMode:NSRunLoopCommonModes];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                           forMode:NSRunLoopCommonModes];
}

-(BOOL) connectWithError:(NSString **) e
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"127.0.0.1", [server port], &readStream, &writeStream);
    inputStream = (__bridge NSInputStream *) readStream;
    outputStream = (__bridge NSOutputStream *) writeStream;

    [inputStream setDelegate:self];
    [outputStream setDelegate:self];

    [self performSelector:@selector(scheduleInCurrentThread:)
                 onThread:[self networkThread]
               withObject:nil
            waitUntilDone:YES];

    [inputStream open];
    [outputStream open];
}

您只需要在NSThread类型的新类中输入此代码。