1

我在线程 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]永远不会被调用,这是应该的。

4

0 回答 0