iOS, GCD(Grand Central Dispatch)1


🧐 ネットワークと非同期の操作を行うために、理解する必要があるGCDを見てみましょう.

🍁 DispatchQueue


DispatchQueueは、タスクを実行するFIFO Queueです.DispatchQueueは、シリアル(シーケンス)または同時(同時)でタスクを実行します.DispatchQueueにコミットされたアクションはThreadで実行されます.

🍁 Main Queue


現在のプロセスのデフォルトスレッドに関連付けられたDispatchキュー.シリアルキューを使用してMainThread操作を行います.
DispatchQueue.main.async {
// UI 관련된 요소 처리
}

🍁 Global Queue


指定したサービス品質レベル(qos)を持つキューに戻ります.defaultはconcurrent queueです.
DispatchQueue.global().async {
// 글로벌 큐에서 비동기 작업 실행
}
DipatchQueue.global(qos: .background).async {
// qos를 설정하여 우선수위를 설정할 수 있습니다.
}
QoS
上部の重要性が高く、より高速に動作します.case userInteractive:
最も緊迫した任務
アニメーション、イベント処理、アプリケーションなどのユーザーインタフェースの更新など、ユーザーと対話します.case userInitiated:
今すぐユーザーが必要ですが、非同期で処理されています.case default:
基本case utility:
ユーザーがアクティブに追跡していないタスク.やや重いタスク(ネットワーク、ネットワークタスク)case background:
すぐに実行する必要のないタスク(位置の更新、閉じるなど)case unspecified:
いいえ、ありません.

🍁 Custom Queue


customが作成したキューで、defaultはシリアルキューです.
let serialQueue = DispatchQueue(label: "serial", qos: .background)
let concQueue = DispatchQueue(label: "concurrent", qos: .background, attributes: .concurrent)

🍁 Serial? Concurrent?


シリアル-1つのThreadで処理
concurrent-複数のThreadの処理

🍁 同期?/Async(非同期)?


sync-作業終了待ち
async-は仕事の完了を待たない.

🍁 ex.swift

DispatchQueue.global().async {
                guard let url = URL(string: "url") else { return } // Global 큐에서 비동기로 실행 (이미지를 가져오는동안 다른 작업을 실행가능하게 하기위해)
                guard let data = try? Data(contentsOf: url) else { return }
                let image = UIImage(data: data)
                DispatchQueue.main.async {
                    imageView.image = image
                } // 메인 큐로 전환하며 ui update
            }
🧐(詳細については、以下の説明を参照してください!)
Apple Developer Documentation