我在线程 A 上添加了一个计时器并启动了 runloop,然后我在线程 A 上 dispatch_async 一个 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]永远不会被调用,这是应该的。