[iOS CS Studio]GCDとは?


21.07.03
これは学習内容を整理するための文章で、完全に正確ではないかもしれません.
参考までに、内容が足りないと思ったら、他の文章を読むこともできます.
+間違った部分、修正が必要な部分は、いつでもフィードバックしてください.😊
                                                 by. ryalya
入る前に.
GCDを理解するために多くの文章を参考にしましたが、できるだけ理解させる文章がありました.
いくつかの部分に分かれていますが、この文章を理解するために、私たちは見て整理しましたので、もっと多くの内容を知りたいなら、次のブログを参考にしてください.(1~4つの部分に分かれています.)

逐次漸進的GCD


GCD (Grand Central Dispatch)


SWIFTでは、スレッド関連のタスクはGrand Central Dispatch APIで処理される.
GCDは、エンクロージャブロック内の特定の操作をキューにアップロードし、特定のスレッド上でキューを実行する方法である.
マルチコアおよびマルチプロセッサ環境でスレッドプログラミングを効率的に行うためには,アップルが開発した技術を用いてスレッドの安全を確保することが重要である.
Queueにタスクを送信すると、対応するスレッドが作成され、割り当てられます.
GCDで使用しているqueue名はDispatch Queue!
-->Dispatch Queueにタスクを追加すると、GCDは対応するスレッドを自動的に生成して実行し、タスクの終了時にそのスレッドを削除します.

画像ソース:GCDコンセプトソースブログ
<예시>
DispatchQueue.global().async {
  // task (작업의 한 단위)
}
→ global().DispatchQueue.タスクを非同期(async)に送信すると、モジュール内のtaskはタスク組織であるため、その動作は順次処理される.
★async(非同期):DispatchQueueにタスクを送信した後、(Queueはそれを処理するかどうか気にしない)残りの私のやるべきことをします!
<예시>
DispatchQueue.global().sync {
  // task (작업의 한 단위)
}
★sync(同期):DispatchQueueにタスクを送信した後、Queueでそのタスクを完了し、残りの作業を行います.

※参考:操作


Operationで使用するqueue名はOperation Queueです.
内部でもGCDで動作します.より多くの機能を追加した形態にすぎない.
  • 個の動作を同時に実行できる最大数
  • を指定する.
  • 動作
  • を一時停止およびキャンセルする.

    論理非同期処理が必要なのはなぜですか?


    asyncとsyncの例の違いは?時間を節約!
    ほとんどの時間がかかるタスクはサーバとの通信であるため,ネットワークに関連するタスクは内部で非同期である.
    URLSession.shared.dataTask(with:request) { (data, response, error) in }
    
    上のコードのようにURLセッションで通信=内部の異なるスレッド+非同期で実現!

    DispatchQueueにタスクを送信した場合、Queueはどのようにしてスタックされたタスクを他のスレッドに送信しますか?



    画像ソース:GCDコンセプトソースブログ
    queueは、queueの特性に応じて、タスクを1つのスレッドに集中するか、複数のスレッドを割り当てるかを選択します.

    1.シリアル(シリアル)


    →(メインスレッドで)分散処理されたタスクを「別のスレッドで」処理するキュー

    画像ソース:GCDコンセプトソースブログ

    2.同時(Concurrent)


    →(メインスレッドで)分散タスクを処理する「他の複数のスレッドで」キュー

    画像ソース:GCDコンセプトソースブログ

    どのキューを使用しますか?


    「タスク順序の重要性、サービス品質」


    シリアルキュー内のタスクは1つのスレッドにのみ割り当てられます
    すべてのタスクは、前のタスクが完了するのを待ってから、1つずつ実行されるので、タスクの開始と終了を順番に予測できます.
    Concurrentキュー内のタスクは、複数のスレッドに割り当てられます.
    いわゆる先入先出キューの特徴によれば,タスクは順番に割り当てられて実行されるが,それらが終了する順序は未知である.
    EX)データ受信時、
    どんなデータが先に入るべきか、順番がいいから、早くすればいい!→Concurrent Queueの使用
    いいえ.順序が重要です...→シリアルキューの使用

    SerialQueue.sync


    :メインスレッド内のワークフローは、キューに渡されたタスクが終了するまで停止します.渡されたタスクは、キューに最初に含まれるタスクと同じスレッドに送信されるため、実行するにはすべて完了する必要があります(シリアルキュー)

    ConcurrentQueue.sync


    :メインスレッド内のワークフローは、キューに渡されたタスクが終了するまで停止します.渡されたタスクは、キュー内の他のタスクおよび他のスレッドに送信できるため、これらのタスクはすべて完了する必要がなく実行できます(Concurrent Queue)

    SerialQueue.async


    :プライマリ・スレッド内のワークフローは、タスクをキューに移行した直後に戻り(async)、移行したタスクは、キューに最初に含まれるタスクと同じスレッドに送信されるため、これらのタスクは完了後に実行する必要があります(シリアル・キュー)

    ConcurrentQueue.async


    :メインスレッド内のワークフローは、タスクをキューに移行した直後に返され、移行したタスクはキュー内のタスクや他のスレッドに送信されるため、これらのタスクがすべて完了していなくても実行できます(Concurrent Queue)

    Reference


    GCDコンセプトソース1
    GCDコンセプトソース2
    GCDコンセプトソース3