非同期ロードの概念とメインスレッドの間で少し混乱しています。何かが非同期的にロードされる場合、それはメインスレッドで実行されないことを意味しますか?私の知る限り、これは2つの異なる概念であり、メインスレッドで非同期に実行することも、バックグラウンド/セカンダリスレッドで非同期に実行することもできます。私が間違っている場合は私を訂正してください。
3 に答える
完全ではありません。非同期で実行するということは、実行が現在のスレッドで続行されるのを止めないことを意味します。これは重要な違いです。非同期で何かを実行して、メインスレッドで終了する可能性があるためです(例:dispatch_async(dispatch_get_main_queue()、^ {some block});)。これは、他のスレッドを停止しないことを意味します。スレッドは続行できませんが、メインスレッドをブロックしています。
メインスレッドはアプリケーションにとって非常に重要であるため、非同期コードの最も一般的な使用法は、メインスレッドをブロックしないようにすることですが、それだけではありません。
(追加するために編集)
おそらく、「xに関して非同期」の観点から考える方が便利です。これを行う場合、例えば:
dispatch_async(aSerialQueue, ^{
work();
work();
});
次に、2つの作業の呼び出しは、相互に同期し、aSerialQueueの他のすべての作業に関しては同期しますが、他のすべてに関しては非同期です。
非同期で何かを実行するということは、タスクが完了する前に呼び出しが戻る可能性があることを意味します。これは、バックグラウンドスレッドで実行されていることが原因である可能性があります。これは、現在のスレッドで後で発生するためである可能性があります。
何かを同期的に実行することは、それがメインスレッドで発生することを意味するわけではありません。これは、タスクが完了するまで呼び出しが戻らないことを意味します。これは、同じスレッドで発生するためである可能性があります。別のスレッドで発生している可能性がありますが、現在のスレッドが他のスレッドの完了を待機する必要があります。
さらに、メインスレッドと現在のスレッドには違いがあることに注意してください。バックグラウンドスレッドで呼び出された同期タスクは、タスクが完了するまでそのバックグラウンドスレッドが移動しないようにしますが、メインスレッドをまったくブロックしません。
もちろん、ほとんどの場合iOSでは、コードはメインスレッドで実行されます。ただし、(APIなどを使用して)バックグラウンドスレッドに作業をプッシュできるdispatch
ため、区別が重要です。
メインスレッドは、すべてのUIを含め、コードの大部分が実行される場所です。Webスレッドやネットワークスレッドなどの他のスレッドもあり、独自のスレッドを作成できます。
同期と非同期は、コードがいつ実行されるかによって決まります。メインスレッドまたはその他のスレッドで、同期または非同期のコードブロックを実行できます。同期している場合は、終了するまで残りのスレッドをブロックします。非同期の場合、スレッドが現在実行しているものから解放されるたびに実行されます。