From 425a767927f7599e5422cf2d24e6d7ab8402031d Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Thu, 23 Oct 2025 14:49:04 +0900 Subject: [PATCH] =?UTF-8?q?perf(app):=20Kingfisher=20=EC=BA=90=EC=8B=9C=20?= =?UTF-8?q?=EC=83=81=ED=95=9C=20=EA=B5=AC=EC=84=B1=20=EB=B0=8F=20=EB=A9=94?= =?UTF-8?q?=EB=AA=A8=EB=A6=AC=20=EC=A0=95=EB=A6=AC=20=ED=9B=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 왜: 디코딩된 비트맵의 과도한 보존으로 피크 메모리 증가. 전역 상한/만료 설정과 시스템 이벤트 연동으로 안정화 필요. 무엇(`SodaLiveApp.swift`): - `ImageCache.default` 구성 - 메모리: `totalCostLimit=120MB`, `countLimit=200`, `expiration=300s` - 디스크: `sizeLimit=500MB` - 훅 추가 - `didReceiveMemoryWarning` → `clearMemoryCache()` - `didEnterBackground` → `cleanExpiredMemoryCache()` 검증: 앱 기동/백그라운드/포어그라운드 전환 플로우 정상, 빌드 성공. --- SodaLive/Sources/App/SodaLiveApp.swift | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/SodaLive/Sources/App/SodaLiveApp.swift b/SodaLive/Sources/App/SodaLiveApp.swift index 9ff2831..9376485 100644 --- a/SodaLive/Sources/App/SodaLiveApp.swift +++ b/SodaLive/Sources/App/SodaLiveApp.swift @@ -6,6 +6,7 @@ // import SwiftUI +import Kingfisher import FBSDKCoreKit import AppsFlyerLib @@ -19,11 +20,34 @@ struct SodaLiveApp: App { @StateObject var canPgPaymentViewModel = CanPgPaymentViewModel() + init() { + configureImageCache() + } + + private func configureImageCache() { + // Kingfisher 전역 캐시 상한 설정 + let cache = ImageCache.default + // 총 메모리 비용(바이트). 이미지 1장이 수 MB 수준이므로 80~150MB 범위 권장 + cache.memoryStorage.config.totalCostLimit = 120 * 1024 * 1024 + // 객체 개수 제한(옵션) + cache.memoryStorage.config.countLimit = 200 + // 메모리 만료 정책(옵션) + cache.memoryStorage.config.expiration = .seconds(300) + // 디스크 캐시 용량 제한(옵션) + cache.diskStorage.config.sizeLimit = 500 * 1024 * 1024 + } + var body: some Scene { WindowGroup { ContentView(canPgPaymentViewModel: canPgPaymentViewModel) .onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in CreatorCommunityMediaPlayerManager.shared.pauseContent() + // 백그라운드 전환 시 메모리 캐시 정리 + ImageCache.default.cleanExpiredMemoryCache() + } + .onReceive(NotificationCenter.default.publisher(for: UIApplication.didReceiveMemoryWarningNotification)) { _ in + // 메모리 경고 수신 시 캐시 즉시 해제 + ImageCache.default.clearMemoryCache() } .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in UIApplication.shared.applicationIconBadgeNumber = 0