Grand Central Dispatch(GCD)は、2009年にiOSとmacOSに登場し、キュー(DispatchQueue)に基づいて非同期コードの並列処理を管理するための低レベルのシステムです。GCDは、タスクの安全な実行、同期、および使いやすいAPIを提供し、手動でのスレッド管理よりも簡潔であることが分かりました。
非同期処理とマルチスレッド処理は、従来、データ競合、デッドロック、インターフェースのフリーズ、複雑なクラッシュなどの問題の原因となります。キューの不適切な使用や、非メインスレッドからUIにアクセスしようとするとバグが発生します。
Swiftでは、バックグラウンド作業を簡単に作成し、タスクの完了を待つためにDispatchGroupを使用して、安全にメインスレッドに戻ってインターフェースを更新できます。非同期作業にはDispatchQueueを使用し、非同期タスクのセットが完了するのを待つ場合はDispatchGroupを使用してください。
コード例:
let backgroundQueue = DispatchQueue(label: "background", qos: .background) backgroundQueue.async { // バックグラウンドスレッドで実行されます let image = downloadImage() DispatchQueue.main.async { // UIを安全に更新します imageView.image = image } }
主な特徴:
メインスレッドからメインキューでsyncを呼び出したらどうなりますか?
デッドロックが発生します:メインスレッドは自分自身でタスクの実行を待っているため、アプリケーションが「フリーズ」します。
DispatchQueue.main.sync { // DEADLOCK }
DispatchQueue.serialはタスクを並行して実行できますか?
いいえ、serialキューは常にタスクを1つずつ実行します。ただし、複数のserialキューを作成すると、それらは並行して実行されます。
メインスレッド以外からUIを更新することは許可されていますか?
いいえ、UIKit(またはSwiftUI View rendering)への操作はDispatchQueue.mainからのみ行うことができます。このルールを破ると不安定な動作やクラッシュが発生します。
バックグラウンドスレッドでデータを読み込んだ後、すぐにUIを更新する。これにより、アプリケーションが時折クラッシュしたり、インターフェースがフリーズしたりします。また、スレッド間での共有可変状態を同期なしで使用します。
利点:
欠点:
すべてのUI更新をDispatchQueue.mainのみで管理し、大データ処理用に専用キューを設け、非同期タスクの完了を管理するためにDispatchGroupを使用します。
利点:
欠点: