0Pricing
Swift Academy · レッスン

Main Thread Checkerとハング

バックグラウンドスレッドでのUI処理を検出し、メインスレッドのハングを解決します。

「Main Thread Checkerとハング」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

Main Thread Checker

Main Thread Checker(MTC)は、実行時にバックグラウンドスレッドから呼び出されたUIKit/AppKit APIを報告するXcodeの診断機能です。

// Enabled by default in Xcode Debug scheme:
// Product → Scheme → Edit → Diagnostics → ☑ Main Thread Checker
// Violating calls log a purple runtime warning in Xcode

MTCでよくある違反

完了ハンドラーやバックグラウンドキューからUIを更新することが、最も頻繁に発生する違反です。

URLSession.shared.dataTask(with: url) { data, _, _ in
  self.label.text = "Done"  // VIOLATION: background thread
}.resume()
// Fix:
DispatchQueue.main.async { self.label.text = "Done" }

async/awaitでのMTC

クラスまたは関数に@MainActorを付けると、そのすべてのメソッドがメインスレッドで実行されることが保証されます。

@MainActor
final class ProfileViewModel: ObservableObject {
  @Published var name = ""
  func load() async {
    name = try? await fetchName()  // always on main thread
  }
}

ハングとは

ハングとは、メインスレッドが長時間ブロックされ、アプリが応答しなくなる状態です。iOSのウォッチドッグは、起動時に20秒を超えてハングしたアプリや、ユーザー操作後にハングしたアプリを終了します。

// Common causes:
// - Synchronous network calls on main thread
// - Heavy computation blocking main run loop
// - Deadlocks between DispatchQueues

InstrumentsのHangsテンプレート

Xcode 14以降のHangs instrumentは、完全なスタックトレースを含むハングイベントを記録し、メインスレッドのブロックを診断します。

// Instruments → Hangs template
// Shows hang duration (ms), call stack, and responsible frame
// Look for synchronous I/O or heavy loops

テストでのMain Thread Checker

MTCはUIテスト中にも動作します。テストスキームで設定すると、自動化されたUIフローの違反を検出できます。

// XCTestScheme Diagnostics → ☑ Main Thread Checker
// UI test violation = instant fail in CI

MetricKitのハングレポート

MetricKitは、MXHangDiagnosticPayloadで本番環境のアプリからハングレポートを収集します。

func didReceive(_ payloads: [MXDiagnosticPayload]) {
  payloads.compactMap { $0.hangDiagnostics }.flatMap { $0 }.forEach {
    print($0.callStackTree)
  }
}

Instrumentsによるハングの検出

トレースを記録し、Main Threadが実行中であるにもかかわらずdisplay linkが発火していない時間帯(フレーム落ち)を探します。

// Time Profiler: look for long CPU bursts on main thread
// Core Animation: FPS drops to 0 during hang
// Hangs instrument: highlights exact frames where hang occurred

よくあるハングの非同期修正

Task.detachedまたはasync letを使って、CPU負荷の高い処理をメインスレッドから移します。

// HANG:
let processed = heavyProcessing(image)  // blocks main thread
// FIX:
let processed = await Task.detached(priority: .userInitiated) {
  heavyProcessing(image)
}.value

メインスレッドでの同期APIの回避

同期的なファイルI/Oやネットワーク呼び出しを非同期の同等処理に置き換えるか、バックグラウンドキューに移します。

// HANG: synchronous file read on main thread
let data = try! Data(contentsOf: largeFileURL)
// FIX:
let data = try await Task.detached { try Data(contentsOf: largeFileURL) }.value

メイン実行ループとタイマー

メイン実行ループ(RunLoop.mainのコールバック内)で長時間実行される処理もハングの原因になります。計算処理をメインループから移します。

// AVOID: heavy work in main-thread timer callback
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
  processAllItems()  // slow!
}
// PREFER: dispatch to background
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
  Task.detached { processAllItems() }
}

理解度チェック

クラスに@MainActorを追加すると、そのメソッド呼び出しについて何が保証されますか。

レッスンのまとめ

DebugスキームでMain Thread Checkerを有効にし、バックグラウンドからUIを操作する違反を検出します。ViewModelとビューには@MainActorを使用します。Task.detachedまたはバックグラウンドキューを使って、負荷の高い処理をメインスレッドから移します。Hangs instrumentとMetricKitのMXHangDiagnosticPayloadを使って、実環境で発生するハングを診断します。

よくある質問

「Main Thread Checkerとハング」レッスンは無料ですか?

はい。「Main Thread Checkerとハング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「Main Thread Checkerとハング」で何を学びますか?

バックグラウンドスレッドでのUI処理を検出し、メインスレッドのハングを解決します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Main Thread Checkerとハング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Instrumentsの基礎:Time Profiler
  2. AllocationsとLeaks Instruments
  3. Main Thread Checkerとハング
  4. ホットパスの最適化:COW、インライン化、特殊化
← Swift Academyに戻る