Layout-Cache und Performance
Verwenden Sie den Layout-Cache für mehr Effizienz.
Layout-Cache und Performance ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum ein Layout-Cache?
SwiftUI kann sizeThatFits und placeSubviews während eines einzigen Layout-Durchlaufs viele Male aufrufen.
Wenn Ihre Berechnungen aufwendig sind, können Sie mit einem Cache einmal berechnen und das Ergebnis wiederverwenden, um wiederholte Arbeit zu vermeiden.
Der zugehörige Cache-Typ
Das Layout-Protokoll besitzt den zugehörigen Typ Cache, der standardmäßig Void ist. Definieren Sie eine eigene Struktur, um vorberechnete Ergebnisse zu speichern.
struct FlowLayout: Layout {
struct CacheData {
var sizes: [CGSize] = []
}
typealias Cache = CacheData
}makeCache
Implementieren Sie makeCache(subviews:), um den initialen Cache zu erstellen. SwiftUI ruft die Methode einmal vor den Layoutmethoden auf und bietet Ihnen so einen Ort für Messungen im Voraus.
func makeCache(subviews: Subviews) -> CacheData {
let sizes = subviews.map { $0.sizeThatFits(.unspecified) }
return CacheData(sizes: sizes)
}Den Cache auslesen
Die Layoutmethoden erhalten nun cache als inout-Parameter. Lesen Sie Ihre vorberechneten Werte aus, statt jede untergeordnete Ansicht erneut zu messen.
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
Wenn sich die Menge der Unteransichten ändert, ruft SwiftUI updateCache(_:subviews:) auf. Die Standardimplementierung erstellt den Cache über makeCache neu. Sie können die Methode jedoch überschreiben, um den Cache schrittweise zu aktualisieren.
func updateCache(_ cache: inout CacheData, subviews: Subviews) {
cache.sizes = subviews.map { $0.sizeThatFits(.unspecified) }
}Wann updateCache ausgeführt wird
updateCache wird ausgeführt, wenn sich die Anzahl oder Identität der Unteransichten ändert – nicht bei jeder Änderung der Geometrie. Cachen Sie nur Daten, die von den Unteransichten abhängen, nicht von der vorgeschlagenen Größe.
Nur vorschlagsunabhängige Daten cachen
Ein häufiger Fehler besteht darin, Ergebnisse zu cachen, die von der vorgeschlagenen Größe abhängen. Der Vorschlag kann sich zwischen Aufrufen ändern. Größenabhängige Ergebnisse müssen daher neu berechnet und dürfen nicht unkritisch gecacht werden.
// OK to cache: intrinsic child sizes
// NOT OK to cache: row breaks (depend on proposed width)Intrinsic Sizes cachen
Das sichere Vorgehen besteht darin, die aufwendigen Ergebnisse von sizeThatFits(.unspecified) zu cachen und die kostengünstige Umbruchberechnung bei jedem Aufruf anhand des aktuellen Vorschlags auszuführen.
struct CacheData { var intrinsic: [CGSize] = [] }
// wrapping uses cache.intrinsic + current maxWidthVorzeitige Optimierung vermeiden
Bei wenigen einfachen untergeordneten Ansichten ist das Messen kostengünstig, und ein Cache bringt zusätzliche Komplexität. Führen Sie zuerst ein Profiling durch und verwenden Sie einen Cache nur, wenn das Messen tatsächlich aufwendig ist, etwa bei Texten, Bildern oder verschachtelten Layouts.
Cache und Wertsemantik
SwiftUI besitzt den Cache und übergibt ihn als inout. Halten Sie ihn als einfachen Werttyp ohne Verweise auf Ansichten, damit SwiftUI seine Lebensdauer sicher verwalten kann.
struct CacheData {
var sizes: [CGSize] // value types only
}Den Nutzen messen
Verwenden Sie das SwiftUI Instrument oder einfache Zähler, um zu überprüfen, ob der Cache die Anzahl der Messaufrufe tatsächlich reduziert. Optimierung ohne Messung ist reine Vermutung.
Kurzer Test: Layout-Cache
Testen Sie Ihr Verständnis des Layout-Cachings.
Zusammenfassung: Layout-Cache und Performance
Der zugehörige Typ Cache des Layout-Protokolls wird von makeCache erstellt und von updateCache aktualisiert. Er speichert aufwendige, vorschlagsunabhängige Arbeit, etwa die intrinsischen Größen untergeordneter Ansichten.
Führen Sie kostengünstige, vorschlagsabhängige Berechnungen bei jedem Aufruf aus. Halten Sie den Cache als wertbasierten Typ ohne Referenzen, vermeiden Sie vorzeitiges Caching und überprüfen Sie den Nutzen vor dem Hinzufügen zusätzlicher Komplexität durch Profiling.
Häufig gestellte Fragen
Ist die Lektion „Layout-Cache und Performance“ kostenlos?
Ja — der vollständige Text von „Layout-Cache und Performance“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Layout-Cache und Performance“?
Verwenden Sie den Layout-Cache für mehr Effizienz. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Layout-Cache und Performance“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Grundlagen des Layout-Protocols
- Subviews messen
- Ein Flow-Layout erstellen
- Layout-Cache und Performance