Swift Academy · Oppitunti

Main Thread Checker ja jumiutumiset

Taustasäikeillä tehtävän käyttöliittymätyön havaitseminen ja pääsäikeen jumiutumisten ratkaiseminen.

Oppitunti 3/413 vaihetta

Main Thread Checker ja jumiutumiset on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Main Thread Checker

Main Thread Checker (MTC) on Xcoden diagnostiikkatyökalu, joka ilmoittaa ajonaikaisesti taustasäikeistä tehdyt UIKit- ja AppKit-ohjelmointirajapintojen kutsut.

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

Yleiset MTC-rikkomukset

Käyttöliittymän päivittäminen valmistumiskäsittelijöistä tai taustajonoista on yleisin rikkomus.

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

MTC ja async/await

Luokan tai funktion merkitseminen määritteellä @MainActor takaa, että kaikki sen metodit suoritetaan pääsäikeessä.

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

Mitä jumitukset ovat?

Jumitus syntyy, kun pääsäie on liian pitkään estynyt, jolloin sovellus ei vastaa. iOS:n watchdog lopettaa käynnistyksen aikana yli 20 sekuntia jumittuvat sovellukset sekä sovellukset, jotka jumittuvat käyttäjän toiminnon jälkeen.

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

Instrumentsin Hangs-malli

Xcode 14:n ja sitä uudempien versioiden Hangs-instrumentti tallentaa jumitustapahtumat täydellisine pinojälkineen pääsäikeen estymisen selvittämistä varten.

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

Main Thread Checker testeissä

MTC toimii myös käyttöliittymätesteissä. Määrittäkää se testikaaviossa, jotta voitte havaita rikkomukset automatisoiduissa käyttöliittymätoiminnoissa.

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

MetricKitin jumitusraportit

MetricKit kerää tuotannossa olevien sovellusten jumitusraportit tyyppiin MXHangDiagnosticPayload.

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

Jumitusten tunnistaminen Instrumentsilla

Tallentakaa jäljitys ja etsikää aikavälejä, jolloin Main Thread suorittaa koodia mutta display link ei laukea (ruutuja jää väliin).

// 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

Asynkroniset korjaukset yleisiin jumituksiin

Siirtäkää suoritinta kuormittava työ pois pääsäikeestä käyttämällä Task.detached- tai async let-rakennetta.

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

Synkronisten rajapintojen välttäminen pääsäikeessä

Korvatkaa synkroniset tiedosto- ja verkkokutsut asynkronisilla vastineilla tai siirtäkää ne taustajonoon.

// 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

Pääajoympyrä ja ajastimet

Pitkäkestoiset toiminnot pääajoympyrässä, kuten RunLoop.main-takaisinkutsut, aiheuttavat myös jumituksia. Siirtäkää laskenta pois pääajoympyrästä.

// 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() }
}

Pikatarkistus

Mitä @MainActor-määritteen lisääminen luokalle takaa sen metodikutsuista?

Oppitunnin yhteenveto

Ottakaa Main Thread Checker käyttöön Debug-kaaviossa, jotta voitte havaita taustasäikeestä tehdyt käyttöliittymäkutsut. Käyttäkää @MainActor-määritettä ViewModel-luokissa ja näkymissä. Siirtäkää raskas työ pois pääsäikeestä käyttämällä Task.detached-rakennetta tai taustajonoja. Diagnosoikaa todellisia jumituksia Hangs-instrumentilla ja MetricKitin MXHangDiagnosticPayload-tyypillä.

Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”Main Thread Checker ja jumiutumiset” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Main Thread Checker ja jumiutumiset”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Main Thread Checker ja jumiutumiset”?

Taustasäikeillä tehtävän käyttöliittymätyön havaitseminen ja pääsäikeen jumiutumisten ratkaiseminen. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Main Thread Checker ja jumiutumiset”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Instruments-perusteet: Time Profiler
  2. Allocations- ja Leaks-instrumentit
  3. Main Thread Checker ja jumiutumiset
  4. Kuumien suorituspolkujen optimointi: COW, inline ja erikoistaminen
← Takaisin: Swift Academy