레이아웃 캐시와 성능
효율성을 위해 레이아웃 캐시를 사용합니다.
레이아웃 캐시와 성능은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
레이아웃 캐시는 왜 필요한가요
SwiftUI는 하나의 layout 단계에서 sizeThatFits와 placeSubviews를 여러 번 호출할 수 있습니다.
계산 비용이 높다면 캐시를 사용하여 한 번 계산한 결과를 재사용하고 반복 작업을 피할 수 있습니다.
Cache 연관 타입
Layout 프로토콜에는 기본값이 Void인 연관 Cache 타입이 있습니다. 미리 계산한 결과를 저장할 사용자 지정 구조체를 정의하세요.
struct FlowLayout: Layout {
struct CacheData {
var sizes: [CGSize] = []
}
typealias Cache = CacheData
}makeCache
makeCache(subviews:)를 구현하여 초기 캐시를 만드세요. SwiftUI는 layout 메서드 전에 이 메서드를 한 번 호출하므로, 사전 측정을 수행할 수 있습니다.
func makeCache(subviews: Subviews) -> CacheData {
let sizes = subviews.map { $0.sizeThatFits(.unspecified) }
return CacheData(sizes: sizes)
}캐시 읽기
이제 layout 메서드는 cache를 inout 매개변수로 받습니다. 모든 자식 뷰를 다시 측정하는 대신 미리 계산한 값을 읽으세요.
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
하위 뷰 집합이 변경되면 SwiftUI가 updateCache(_:subviews:)를 호출합니다. 기본 구현은 makeCache를 통해 캐시를 다시 만들지만, 필요하면 재정의하여 점진적으로 업데이트할 수 있습니다.
func updateCache(_ cache: inout CacheData, subviews: Subviews) {
cache.sizes = subviews.map { $0.sizeThatFits(.unspecified) }
}updateCache가 실행되는 시점
updateCache는 하위 뷰의 개수나 식별성이 변경될 때 실행되며, 모든 geometry 변경 때마다 실행되지는 않습니다. 제안된 size가 아니라 하위 뷰에 종속된 데이터만 캐시하세요.
제안과 무관한 데이터만 캐시하기
흔히 발생하는 버그는 제안된 size에 종속된 결과를 캐시하는 것입니다. 호출 사이에 제안이 바뀔 수 있으므로, size에 종속된 결과는 무조건 캐시하지 말고 다시 계산해야 합니다.
// OK to cache: intrinsic child sizes
// NOT OK to cache: row breaks (depend on proposed width)intrinsic 크기 캐싱
안전한 패턴은 비용이 큰 sizeThatFits(.unspecified) 결과를 캐시한 다음, 현재 제안을 사용하여 호출마다 저렴한 줄 바꿈 계산을 실행하는 것입니다.
struct CacheData { var intrinsic: [CGSize] = [] }
// wrapping uses cache.intrinsic + current maxWidth성급한 최적화 피하기
간단한 자식 뷰가 몇 개뿐이라면 측정 비용이 낮고 캐시가 복잡성만 더할 수 있습니다. 먼저 프로파일링하고, 측정 비용이 실제로 큰 경우(텍스트, 이미지, 중첩 layout)에만 캐시를 사용하세요.
캐시와 값 의미론
캐시는 SwiftUI가 소유하며 inout으로 전달됩니다. SwiftUI가 수명을 안전하게 관리할 수 있도록 뷰에 대한 참조가 없는 단순한 값 타입으로 유지하세요.
struct CacheData {
var sizes: [CGSize] // value types only
}효과 측정하기
SwiftUI 계측 도구나 간단한 카운터를 사용하여 캐시가 실제로 측정 호출을 줄이는지 확인하세요. 측정 없는 최적화는 추측에 불과합니다.
빠른 확인: 레이아웃 캐시
레이아웃 캐싱에 대한 이해도를 테스트합니다.
복습: 레이아웃 캐시와 성능
makeCache로 만들고 updateCache로 갱신하는 Layout 프로토콜의 Cache 연관 타입은 intrinsic 자식 크기처럼 비용이 크고 제안과 무관한 작업의 결과를 저장합니다.
제안에 종속된 계산은 호출마다 저렴하게 실행하세요. 캐시는 참조가 없는 값 타입으로 유지하고, 성급한 캐싱을 피하며, 복잡성을 추가하기 전에 프로파일링으로 이점이 있는지 확인하세요.
자주 묻는 질문
“레이아웃 캐시와 성능” 강의는 무료인가요?
네 — “레이아웃 캐시와 성능” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“레이아웃 캐시와 성능”에서 뭘 배우나요?
효율성을 위해 레이아웃 캐시를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“레이아웃 캐시와 성능” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Layout 프로토콜 기초
- 하위 뷰 측정하기
- 플로 레이아웃 만들기
- 레이아웃 캐시와 성능