主队列中没有异步



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

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

上面的代码"方法调用"将在" main_async Invoke"之前编写。但是代码bellow可能Sai No:

 - (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 indoke"之后写入我认为这是因为" Runloop"。是否有人可以解释这就是为什么?

在主线程上运行async与主线程上的sync之间存在差异。 sync基本上是指,现在就这样做, async表示,在主线程上进行,但不必在这个确切的时刻。

有人可以解释这是原因吗?

因为它是async - 异步。这就是异步的意思。它的意思是"以后"。

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

相关内容

  • 没有找到相关文章

最新更新