Swift Academy · Lektion

Layout-cache och prestanda

Använd layout-cachen för effektivitet.

Lektion 4 av 413 steg

Layout-cache och prestanda är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 4 lektioner.

Varför en layoutcache

SwiftUI kan anropa sizeThatFits och placeSubviews många gånger under ett enda layoutpass.

Om beräkningarna är kostsamma låter en cache dig beräkna en gång och återanvända resultatet, så att upprepat arbete undviks.

Den associerade typen Cache

Protokollet Layout har en associerad typ Cache som som standard är Void. Definiera en egen struct för att lagra förberäknade resultat.

struct FlowLayout: Layout {
    struct CacheData {
        var sizes: [CGSize] = []
    }
    typealias Cache = CacheData
}

makeCache

Implementera makeCache(subviews:) för att bygga den initiala cachen. SwiftUI anropar den en gång före layoutmetoderna, vilket ger dig en plats för inledande mätning.

func makeCache(subviews: Subviews) -> CacheData {
    let sizes = subviews.map { $0.sizeThatFits(.unspecified) }
    return CacheData(sizes: sizes)
}

Läsa cachen

Layoutmetoderna tar nu emot cache som en inout-parameter. Läs dina förberäknade värden i stället för att mäta varje barn igen.

func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout CacheData) -> CGSize {
    let height = cache.sizes.map(\.height).max() ?? 0
    let width = cache.sizes.reduce(0) { $0 + $1.width }
    return CGSize(width: width, height: height)
}

updateCache

När mängden subvyer ändras anropar SwiftUI updateCache(_:subviews:). Standardimplementeringen bygger om cachen via makeCache, men du kan åsidosätta den för att uppdatera inkrementellt.

func updateCache(_ cache: inout CacheData, subviews: Subviews) {
    cache.sizes = subviews.map { $0.sizeThatFits(.unspecified) }
}

När updateCache körs

updateCache körs när antalet subvyer eller deras identitet ändras – inte vid varje geometriförändring. Cacha bara data som beror på subvyerna, inte på den föreslagna storleken.

Cacha bara förslagsoberoende data

Ett vanligt fel är att cacha resultat som beror på den föreslagna storleken. Förslaget kan ändras mellan anrop, så storleksberoende resultat måste beräknas om och får inte cachas blint.

// OK to cache: intrinsic child sizes
// NOT OK to cache: row breaks (depend on proposed width)

Cacha naturliga storlekar

Ett säkert mönster är att cacha de kostsamma resultaten från sizeThatFits(.unspecified) och sedan utföra den billiga radbrytningsaritmetiken vid varje anrop med det aktuella förslaget.

struct CacheData { var intrinsic: [CGSize] = [] }
// wrapping uses cache.intrinsic + current maxWidth

Undvik för tidig optimering

För en handfull enkla barn är mätning billig och en cache tillför komplexitet. Profilera först och använd cache först när mätningen faktiskt är kostsam, till exempel för text, bilder eller nästlade layouter.

Cache och värdesemantik

Cachen ägs av SwiftUI och skickas som inout. Håll den som en enkel värdetyp utan referenser till vyer, så att SwiftUI kan hantera dess livstid säkert.

struct CacheData {
    var sizes: [CGSize] // value types only
}

Mäta vinsten

Använd SwiftUI Instrument eller enkla räknare för att bekräfta att cachen faktiskt minskar antalet mätanrop. Optimering utan mätning är bara gissningar.

Snabbtest: Layoutcache

Testa din förståelse av layoutcachning.

Sammanfattning: Layoutcache och prestanda

Den associerade typen Cache i protokollet Layout, som byggs av makeCache och uppdateras av updateCache, lagrar kostsamt arbete som är oberoende av förslaget, till exempel barnens naturliga storlekar.

Utför billig, förslagsberoende aritmetik vid varje anrop. Håll cachen som en referensfri värdetyp, undvik för tidig cachning och verifiera nyttan med profilering innan du tillför komplexitet.

Gratis att börja

Lär dig Swift med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
122
Lektioner
409

Vanliga frågor

Är lektionen ”Layout-cache och prestanda” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Layout-cache och prestanda”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Layout-cache och prestanda”?

Använd layout-cachen för effektivitet. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Swift Academy?

Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Layout-cache och prestanda”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Swift Academy-lektionen?

Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Grunderna i Layout-protokollet
  2. Mäta subviews
  3. Bygga en flow layout
  4. Layout-cache och prestanda
← Tillbaka till Swift Academy