我在线程A上添加了一个计时器并启动了runloop,之后我在线程A上调度了一个Method_Foo,并且Method_Foo没有运行。我猜测调度方法将被该线程上的runLoop阻止,但我不确定。是真的还是我错过了什么?
更多详情:
在网络层我使用委托通知网络状态, _delegateQueue 来自全局实例,假设 Thread_A 。这个 socket:didConnectToHost:port:方法在Thread_B中运行。
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
// called when connected to server
...
dispatch_async(_delegateQueue, ^{
// this runs in Thread_A to notify network status
[theDelegate socketConnection:self didChangeStatus:YES];
});
...
}
然后在上层有一个类在与 Thread_A 中的服务器断开连接后运行 _startReconnectingProcess 方法。为了使计时器工作,我在 Thread_A 中启动runLoop。
// runs in Thread_A to start reconnection process
- (void)_startReconnectingProcess
{
if (self.reconnectionTimer || _forceDisconnection == YES) return;
self.reconnectionTimer = [NSTimer scheduledTimerWithTimeInterval:kReconnectionTimeInterval target:self selector:@selector(_reconnect) userInfo:nil repeats:YES];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:self.reconnectionTimer forMode:NSDefaultRunLoopMode];
// run the runLoop in Thread_A
[runLoop run];
// after the runLoop start, the dispatch_async method in the network layer doesn't work
self.reconnectionCount = 0;
}
所以会发生的是当计时器启动时,方法 [theDelegate socketConnection:self didChangeStatus:YES] 永远不会被调用,这应该是。