主队列中没有异步?

时间:2017-03-01 13:42:39

标签: ios dispatch-async runloop

我们知道main_queue是一个串行队列。没有真正的异步。

 - (void)someMethod{
   dispatch_async(dispatch_get_main_queue(),^{
    NSLog(@"main_async invoke");
   });
  NSLog(@"method invoke");
 }

上面的代码"方法调用"将在" main_async调用"之前写入。因为在main_queue中没有真正的异步。但是下面的代码可能没有:

 - (void)someMethod{
  __block BOOL flag=YES;
      NSBlockOperation *blockOperation = [NSBlockOperation      blockOperationWithBlock:^{
                NSLog(@"blockOperation invoke");
                [NSThread sleepForTimeInterval:4];
                dispatch_async(dispatch_get_main_queue(), ^{
                           NSLog(@"main_async invoke");
                          flag=NO;
                });
      }];
      [blockOperation start];
      while (flag) {
                [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
      }
      NSLog(@"method invoke");
     }

上面的代码"方法调用"将在" main_async调用"之后写入 我认为这是因为' RunLoop'。是否有人可以解释这是为什么?

2 个答案:

答案 0 :(得分:0)

主线程上运行async和主线程上运行sync之间存在差异。 sync基本上意味着,现在就做,async意味着,在主线程上执行,但它不一定是在这个确切的时刻。

答案 1 :(得分:0)

  

有没有人可以解释这是为什么?

因为它是async - 异步。这就是异步意味着什么。这意味着"以后"。

您的代码在[blockOperation start];到方法结束后向前进行。只有这样才能释放主线程。所以只有这样,主线程上的异步块才有机会进入并执行。