Main Thread Checker ja jumiutumiset
Taustasäikeillä tehtävän käyttöliittymätyön havaitseminen ja pääsäikeen jumiutumisten ratkaiseminen.
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 XcodeYleiset 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 DispatchQueuesInstrumentsin 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 loopsMain 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 CIMetricKitin 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 occurredAsynkroniset 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)
}.valueSynkronisten 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) }.valuePää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ä.
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
- Instruments-perusteet: Time Profiler
- Allocations- ja Leaks-instrumentit
- Main Thread Checker ja jumiutumiset
- Kuumien suorituspolkujen optimointi: COW, inline ja erikoistaminen