我们知道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];
之后向前进行到该方法的末尾。只有这样,主线程才能释放。因此,只有这样,主线程上的异步块才有机会进入并执行。