Actor (Swift 5.5+) vs GCD (DispatchQueue) 比較

構造化された並行処理、コンパイラによるデータ競合フリー

VS
GCD (DispatchQueue)

レガシーなGrand Central Dispatch、iOS 4+

9 分で読了iOS

スコア比較

グラフを読み込み中...

詳細スコア

詳細スコア: Actor (Swift 5.5+) GCD (DispatchQueue) — カテゴリー別10点満点のスコア
カテゴリーActor (Swift 5.5+)GCD (DispatchQueue)
パフォーマンス
9/10
10/10
学習のしやすさ
8/10
6/10
エコシステム
9/10
8/10
コミュニティ
9/10
9/10
求人市場
10/10
7/10
将来性
10/10
6/10

長所と短所

Actor (Swift 5.5+)

長所

  • コンパイル時のデータ競合安全性
  • async/awaitがネイティブ対応
  • Swift 6の厳格な並行処理の強制
  • @MainActor、@globalActorが明示的
  • nonisolatedメソッドでスレッドフリーな読み取り
  • Actorホップが透過的
  • Swift Testingフレームワークと互換
  • デバッグが容易 — コールスタックが明示的

短所

  • Swift 5.5+のみ対応
  • Actorの分離モデルには学習コストがある
  • Sendable適合の厳格なルール
  • パフォーマンス上のActorホップのオーバーヘッドはわずかだが存在する

最適な用途

新規のiOS 15+アプリスレッド間で共有される状態Async/awaitワークフローデータ競合に敏感なコード(金融、セキュリティ)Swift 6移行プロジェクト

GCD (DispatchQueue)

長所

  • iOS 4+の幅広いサポート
  • 15年以上の実運用実績
  • グローバルキュー+カスタムキューの柔軟性
  • QoSクラス(userInteractive、utility、background)
  • DispatchSemaphore、DispatchGroupのプリミティブ
  • DispatchSourceTimerによるきめ細かな制御
  • 低レベルのパフォーマンスチューニング
  • Objective-Cとの相互運用

短所

  • データ競合をコンパイル時に検出できない
  • コールバック地獄・ネストしたクロージャの可読性の低さ
  • @MainActorのような明示性がない — 手動でDispatchQueue.main.asyncを使う必要がある
  • デバッグが難しい — スレッドコンテキストの特定にInstrumentsが必要
  • Swift 6への移行が困難

最適な用途

レガシーiOSアプリ(iOS 10-14)パフォーマンスが重要な低レベル処理(動画フレーム、音声)Objective-Cコードベースとの相互運用カスタムスケジューリングが必要な要件DispatchSourceTimer、セマフォが必要な場合

コード比較

Actor (Swift 5.5+)
actor UserCache {
    private var cache: [String: User] = [:]

    func get(id: String) -> User? {
        return cache[id]
    }

    func set(id: String, user: User) {
        cache[id] = user
    }
}

// 使用例
let cache = UserCache()
let user = await cache.get(id: "123")  // actorホップは自動的に発生
GCD (DispatchQueue)
import Foundation

class UserCache {
    private let queue = DispatchQueue(label: "cache", attributes: .concurrent)
    private var cache: [String: User] = [:]

    func get(id: String, completion: @escaping (User?) -> Void) {
        queue.async {
            completion(self.cache[id])
        }
    }

    func set(id: String, user: User) {
        queue.async(flags: .barrier) {
            self.cache[id] = user
        }
    }
}

結論

Swift 5.5+の新規コードにはActorが必須。レガシーiOS 10-14はGCDのまま。ハイブリッド: 新規モジュールはActor、既存GCDは維持しつつ段階的に移行。Swift 6の厳格な並行処理は2026年に必須化。

無料相談を受ける
FAQ

よくある質問

Actorホップは10-50ns — マイクロ秒レベルです。動画処理のような超低レイテンシが求められる場合はまだGCDが優先されますが、それ以外のほぼすべてのケースでActorが適しています。

関連ブログ記事

すべての記事を見る
すべての比較