-1

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

 - (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”。有没有人可以解释这是为什么?

4

2 回答 2

0

async在主线程上运行和 在主线程上运行是有区别sync的。sync基本上意味着,现在就做,async意思是,在主线程上做,但不一定要在这个确切的时刻。

于 2017-03-01T14:06:21.683 回答
0

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

因为它是async——异步的。这就是异步的意思。它的意思是“以后”。

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

于 2017-03-01T14:24:04.370 回答