我々はmain_queueシリアルqueue.Thereが本当の非同期ではありません知っているよう。メインキューに非同期はありませんか?
- (void)someMethod{
dispatch_async(dispatch_get_main_queue(),^{
NSLog(@"main_async invoke");
});
NSLog(@"method invoke");
}
コード上では実際の非同期がない.becauseでmain_queue「main_asyncが起動する」前に書き込みされる「メソッド呼び出し」。しかし、コードが怒鳴るNO SAIないことがあります。
- (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'.Isのだと思いますか?
「本当の非同期」とはどういう意味ですか?最初の例では、ブロックは非同期に実行されます。あなたが指摘しているように、メインキューはシリアルキューであり、タスクがプリエンプトされていないため、ブロックは現在のメソッドが戻ってからしばらくするまで実行されませんが、まだ非同期です。並列実行を意味するかもしれませんが、シリアル・キューではこれを実行できません。 – Paulw11
最初のexample.myの質問は、2番目の例では 'NSLog(@ "main invoke")'がNSLog(@ "method invoke")の前に実行される理由です。現在のメソッドが返ってからしばらく時間がかかります。 2番目の例では、現在のメソッドが戻る前にブロックが実行されます。 – DoradoIs90
2番目のブロックで操作を直接開始しているためです。後で実行するために、操作キューにそれを送信していません。 – Paulw11