2017-03-01 17 views
-1

我々は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のだと思いますか?

+0

「本当の非同期」とはどういう意味ですか?最初の例では、ブロックは非同期に実行されます。あなたが指摘しているように、メインキューはシリアルキューであり、タスクがプリエンプトされていないため、ブロックは現在のメソッドが戻ってからしばらくするまで実行されませんが、まだ非同期です。並列実行を意味するかもしれませんが、シリアル・キューではこれを実行できません。 – Paulw11

+0

最初のexample.myの質問は、2番目の例では 'NSLog(@ "main invoke")'がNSLog(@ "method invoke")の前に実行される理由です。現在のメソッドが返ってからしばらく時間がかかります。 2番目の例では、現在のメソッドが戻る前にブロックが実行されます。 – DoradoIs90

+0

2番目のブロックで操作を直接開始しているためです。後で実行するために、操作キューにそれを送信していません。 – Paulw11

答えて

0

メインスレッドでasync、メインスレッドでsyncの実行との違いがあります。 syncは基本的には今のところ、asyncということを意味していますが、それはメインスレッドで行いますが、この瞬間にする必要はありません。

0

誰もがその理由を説明できますか?

async - 非同期ですので、それは非同期を意味します。それは「後で」を意味します。

お客様のコードは、[blockOperation start];の後にメソッドの最後まで進みます。その後、メインスレッドは解放されます。だから、メインスレッド上の非同期ブロックが入ってきて、実行される機会があります。

+0

'dispatch_async'の' async'または 'sync'が' dispatch_async'呼び出しに適用される'dispatch_sync'はブロックが実行されるのを待ちます。' dispatch_async'は実行されません。 –

関連する問題