我最近一直在研究一个示例应用程序,试图完全理解NSRunLoop
。我编写的示例创建了一个简单的辅助线程,通过NSOperation
实现。辅助线程执行一些任务,比如处理NSTimer
以及通过NSStream
进行一些基本的流处理。这两个输入源都需要一个正确配置的NSRunLoop
才能执行。
我的问题是这样的。最初,在辅助线程中我有一些代码看起来像这样:
NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop];
self.connectTimer = [NSTimer scheduledTimerWithTimeInterval:connectTimeout
target:self
selector:@selector(connectionConnectedCheck:)
userInfo:nil
repeats:NO];
[myRunLoop addTimer:self.connectTimer forMode:NSDefaultRunLoopMode]; // added source here
[myRunLoop run];
[NSStream getStreamsToHostNamed:relayHost port:relayPort inputStream:&inputStream outputStream:&outputStream];
if ((inputStream != nil) && (outputStream != nil))
{
sendState = kSKPSMTPConnecting;
isSecure = NO;
[inputStream retain];
[outputStream retain];
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop: myRunLoop //[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[outputStream scheduleInRunLoop: myRunLoop //[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[inputStream open];
[outputStream open];
self.inputString = [NSMutableString string];
return YES;
}
现在,使用上面的代码,事件将永远不会被处理。不会在currentRunLoop上。之后我做了一些可怕的事情,因为这只是一个教育练习,所以修改它以在NSRunLoop mainRunLoop下运行。像魔法一样工作。然而,我几乎可以确定,在次要线程中依赖于我的主线程运行循环是错误的。
所以我的问题分两部分,希望这没问题。
- 通过应用我采取的小“hack”来使次要线程运行并响应运行循环中的事件,可能会出现什么问题?
- 如何正确配置次要线程以监听所有事件/基于计时器的源,以便无需执行步骤1。
感谢大家的见解。