mcpField
A
axiom-ios-concurrency

axiom-ios-concurrency

github.com/charleswiltgen開発1.2k216 回インストール今日更新
リポジトリ

axiom-ios-concurrency について

iOS 開発者向けの Swift 並行処理ルーティングスキルです。状況に応じて、async/await、Swift 6、スレッド安全性などの課題を専門スキルやエージェントへ振り分けます。

主な機能

  1. 01並行処理の分野別ルーティング
  2. 02Swift と Core Data のスレッド問題を区別
  3. 03並行処理の判断ツリー
  4. 04自動監査依頼のルーティング

活用シーン

  1. 01Swift 6 のデータ競合や分離エラーの調査
  2. 02読み込み中に起きる UI フリーズの調査
  3. 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:アプリがフリーズしたり、動作が遅く感じられたりする場合:

  1. まず ios-concurrency を試してください — メインスレッドのブロックは、UI フリーズの最大の原因です。プロファイリングの前に、@MainActor 上で同期処理が行われていないか確認してください。
  2. 並行処理の修正で解決しない場合に限り、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 対応状況の評価)

判断ツリー

  1. データ競合/アクター分離/@MainActor/Sendable? → swift-concurrency 1a. 特定の API 構文(アクターの定義、TaskGroup、AsyncStream、continuation)が必要ですか? → swift-concurrency-ref
  2. async/await コードを書いていますか? → swift-concurrency
  3. Swift 6 への移行ですか? → swift-concurrency
  4. assumeIsolated/@preconcurrency? → assume-isolated
  5. Mutex/ロック/同期? → synchronization
  6. borrowing/consuming/~Copyable? → ownership-conventions
  7. 非同期処理のパフォーマンス/アクターの競合をプロファイリングしますか? → concurrency-profiling
  8. 値型/ARC/ジェネリックの最適化? → swift-performance
  9. 並行処理のスキャンを自動化しますか? → concurrency-auditor(Agent)
  10. 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 エージェント

コメント