axiom-ios-concurrency について
iOS 開発者向けの Swift 並行処理ルーティングスキルです。状況に応じて、async/await、Swift 6、スレッド安全性などの課題を専門スキルやエージェントへ振り分けます。
主な機能
- 01並行処理の分野別ルーティング
- 02Swift と Core Data のスレッド問題を区別
- 03並行処理の判断ツリー
- 04自動監査依頼のルーティング
活用シーン
- 01Swift 6 のデータ競合や分離エラーの調査
- 02読み込み中に起きる UI フリーズの調査
- 03actor、ロック、Combine の選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ charleswiltgen/ axiom --skill axiom-ios-concurrencyインストール後、Claude Code で/axiom-ios-concurrencyを入力して読み込まれたか確認します。
詳細
iOS 並行処理ルーター
並行処理、async/await、スレッド、または Swift 6 の並行処理に関する作業では、必ずこのスキルを使用してください。
使用する場面
次の場合にこのルーターを使用します。
- async/await コードを書く場合
- 並行処理エラー(データ競合、アクター分離)が発生した場合
- @MainActor を扱う場合
- Sendable 準拠に対処する場合
- Swift のパフォーマンスを最適化する場合
- Swift 6 の並行処理に移行する場合
- 読み込み中にアプリがフリーズする場合(メインスレッドのブロックが原因と考えられます)
競合の解決
ios-concurrency と ios-performance:アプリがフリーズしたり、動作が遅く感じられたりする場合:
- まず ios-concurrency を試してください — メインスレッドのブロックは、UI フリーズの最大の原因です。プロファイリングの前に、@MainActor 上で同期処理が行われていないか確認してください。
- 並行処理の修正で解決しない場合に限り、ios-performance を使用してください — 明らかなブロック要因を除外してからプロファイリングします。
ios-concurrency と ios-build:Swift 6 の並行処理エラーが発生した場合:
- ios-build ではなく ios-concurrency を使用してください — 並行処理エラーはコードの問題であり、環境の問題ではありません
- ios-build は「No such module」、シミュレーターの問題、Swift 言語エラーとは無関係なビルド失敗に使用します
ios-concurrency と ios-data:並行処理エラーに Core Data または SwiftData が関係する場合:
- Core Data のスレッド処理(NSManagedObjectContext のスレッド制約、performBackgroundTask)→ まず ios-data を使用してください — Core Data には Swift の並行処理とは異なる独自のスレッドモデルがあります
- SwiftData と @MainActor ModelContext → ios-concurrency を使用してください — これは Swift の並行処理における分離の問題です
- 一般的な「バックグラウンド保存でデータが失われる」問題 → まず ios-data を使用してください — フレームワーク固有のスレッド規則が優先されます
理由:データ読み込み中の 2 秒間のフリーズは、ほとんどの場合、メインスレッド上での await、またはバックグラウンド実行への切り替え漏れが原因です。Time Profiler を使うより、ドメイン知識を活用したほうが早く解決できます。Core Data のスレッド処理違反には、一般的な並行処理パターンではなく、Core Data 固有の修正が必要です。
ルーティングロジック
Swift の並行処理に関する問題
Swift 6 の並行処理パターン → /skill axiom-swift-concurrency
- async/await パターン
- @MainActor の使用
- アクター分離
- Sendable 準拠
- データ競合の防止
- Swift 6 への移行
Swift の並行処理 API リファレンス → /skill axiom-swift-concurrency-ref
- アクターの定義、再入可能性、グローバルアクター
- Sendable パターン、@unchecked Sendable
- Task/TaskGroup/キャンセル API
- AsyncStream、継続
- DispatchQueue → アクターへの移行
Swift のパフォーマンス → /skill axiom-swift-performance
- 値型と参照型
- コピーオンライトの最適化
- ARC のオーバーヘッド
- ジェネリックの特殊化
- コレクションのパフォーマンス
同期的なアクターアクセス → /skill axiom-assume-isolated
- MainActor.assumeIsolated
- @preconcurrency プロトコル準拠
- レガシーなデリゲートコールバック
- MainActor のコードを同期的にテストする方法
スレッドセーフなプリミティブ → /skill axiom-synchronization
- Mutex(iOS 18 以降)
- OSAllocatedUnfairLock(iOS 16 以降)
- アトミック型
- ロックとアクターの選択
パラメーターの所有権 → /skill axiom-ownership-conventions
- borrowing/consuming 修飾子
- 非コピー可能型(~Copyable)
- ARC の処理量の削減
- consume 演算子
並行処理のプロファイリング → /skill axiom-concurrency-profiling
- Swift Concurrency Instruments テンプレート
- アクター競合の診断
- スレッドプールの枯渇
- タスクの可視化
Combine のリアクティブパターン → /skill axiom-combine-patterns
- Publisher/Subscriber のライフサイクル、AnyCancellable
- Combine と async/await の選択
- @Published と ObservableObject
- オペレーターパターン、ブリッジング
自動スキャン
並行処理の監査 → concurrency-auditor エージェントを起動するか、/axiom:audit concurrency を実行します(5 フェーズのセマンティック監査:分離アーキテクチャのマッピング、8 種類のアンチパターンの検出、欠落している並行処理パターンの推論、複合リスクの関連付け、Swift 6.3 対応状況の評価)
判断ツリー
- データ競合/アクター分離/@MainActor/Sendable? → swift-concurrency 1a. 特定の API 構文(アクターの定義、TaskGroup、AsyncStream、continuation)が必要ですか? → swift-concurrency-ref
- async/await コードを書いていますか? → swift-concurrency
- Swift 6 への移行ですか? → swift-concurrency
- assumeIsolated/@preconcurrency? → assume-isolated
- Mutex/ロック/同期? → synchronization
- borrowing/consuming/~Copyable? → ownership-conventions
- 非同期処理のパフォーマンス/アクターの競合をプロファイリングしますか? → concurrency-profiling
- 値型/ARC/ジェネリックの最適化? → swift-performance
- 並行処理のスキャンを自動化しますか? → concurrency-auditor(Agent)
- Combine/@Published/AnyCancellable/リアクティブストリーム? → combine-patterns
理屈をつけた回避
| 考え | 実際のところ |
|---|---|
| 「@MainActor を追加すれば動くはず」 | @MainActor には分離の継承ルールがあります。swift-concurrency では、あらゆるパターンを扱います。 |
| 「nonisolated(unsafe) を使って警告を消そう」 | 警告を消すとデータ競合が見えなくなります。swift-concurrency では安全なパターンを紹介しています。 |
| 「async 呼び出しは 1 回だけだから」 | 1 回だけの async 呼び出しでも、キャンセルや分離に影響します。swift-concurrency ではそれらを扱います。 |
| 「アクターの仕組みはわかっている」 | Swift 6.2 でアクターの再入可能性と分離ルールが変更されました。swift-concurrency は最新です。 |
| 「Sendable の警告は後で修正する」 | Sendable 違反は実行時クラッシュの原因になります。swift-concurrency なら、今すぐ正しく修正できます。 |
| 「Combine はもう使われていないから、async/await を使えばいい」 | Combine の非推奨告知はありません。動作しているパイプラインを書き換えると、時間を浪費し、バグを招きます。combine-patterns では段階的な移行を扱います。 |
重要なパターン
Swift 6 の並行処理(swift-concurrency):
- 段階的な進め方:シングルスレッド → 非同期 → 並行処理 → アクター
- バックグラウンド実行を強制する @concurrent 属性
- 分離された適合
- 取り組みやすい並行処理のためのメインアクターモード
- コピーして使える 11 個のパターン
Swift のパフォーマンス(swift-performance):
- コピー不可の型に使う ~Copyable
- コピーオンライト(COW)パターン
- 値型と参照型の選択
- ARC のオーバーヘッド削減
- ジェネリックの特殊化
使用例
ユーザー:「Swift 6 で「data race」エラーが発生しています」
→ 呼び出し:/skill axiom-swift-concurrency
ユーザー:「@MainActor を正しく使うにはどうすればよいですか?」
→ 呼び出し:/skill axiom-swift-concurrency
ユーザー:「不要なコピーが原因でアプリの動作が遅くなっています」
→ 呼び出し:/skill axiom-swift-performance
ユーザー:「このネットワークリクエストには async/await を使うべきですか?」
→ 呼び出し:/skill axiom-swift-concurrency
ユーザー:「assumeIsolated の使い方を教えてください」
→ 呼び出し:/skill axiom-assume-isolated
ユーザー:「デリゲートのコールバックがメインスレッドで実行されます。MainActor の状態にアクセスするにはどうすればよいですか?」
→ 呼び出し:/skill axiom-assume-isolated
ユーザー:「Mutex と actor のどちらを使うべきですか?」
→ 呼び出し:/skill axiom-synchronization
ユーザー:「os_unfair_lock と OSAllocatedUnfairLock の違いは何ですか?」
→ 呼び出し:/skill axiom-synchronization
ユーザー:「Swift の borrowing とは何ですか?」
→ 呼び出し:/skill axiom-ownership-conventions
ユーザー:「~Copyable 型の使い方を教えてください」
→ 呼び出し:/skill axiom-ownership-conventions
ユーザー:「async コードの動作が遅いのですが、プロファイルするにはどうすればよいですか?」
→ 呼び出し:/skill axiom-concurrency-profiling
ユーザー:「actor の競合が発生していると思います。診断するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-concurrency-profiling
ユーザー:「Core Data の保存で、バックグラウンドタスクのデータが失われます」
→ 次にルーティング:ios-data ルーター(Core Data のスレッド処理はフレームワーク固有です)
ユーザー:「TaskGroup を作成するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-swift-concurrency-ref
ユーザー:「AsyncStream API について教えてください」
→ 呼び出し:/skill axiom-swift-concurrency-ref
ユーザー:「カスタムのグローバルアクターを作成するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-swift-concurrency-ref
ユーザー:「完了ハンドラーを async に変換するにはどうすればよいですか?」
→ 呼び出し:/skill axiom-swift-concurrency-ref
ユーザー:「actor のリエントランシー規則とは何ですか?」
→ 呼び出し:/skill axiom-swift-concurrency-ref
ユーザー:「Combine のパイプラインが、値を生成しなくなったのに何も通知されません」
→ 呼び出し:/skill axiom-combine-patterns
ユーザー:「このデータフローには Combine と async/await のどちらを使うべきですか?」
→ 呼び出し:/skill axiom-combine-patterns
ユーザー:「Combine の publisher を async/await コードにブリッジするにはどうすればよいですか?」
→ 呼び出し:/skill axiom-combine-patterns
ユーザー:「AnyCancellable でメモリリークが発生しています」
→ 呼び出し:/skill axiom-combine-patterns
ユーザー:「Swift 6 の並行処理に関する問題がないか、コードを確認してください」
→ 呼び出し:concurrency-auditor エージェント