runloop会阻止GCD吗?

时间:2012-04-09 08:48:47

标签: ios objective-c grand-central-dispatch

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

0 个答案:

没有答案