我们知道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'。是否有人可以解释这是为什么?
答案 0 :(得分:0)
主线程上运行async
和主线程上运行sync
之间存在差异。 sync
基本上意味着,现在就做,async
意味着,在主线程上执行,但它不一定是在这个确切的时刻。
答案 1 :(得分:0)
有没有人可以解释这是为什么?
因为它是async
- 异步。这就是异步意味着什么。这意味着"以后"。
您的代码在[blockOperation start];
到方法结束后向前进行。只有这样才能释放主线程。所以只有这样,主线程上的异步块才有机会进入并执行。