我已经阅读了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)那样自动完成。
答案 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类型的新类中输入此代码。