perf(app): Kingfisher 캐시 상한 구성 및 메모리 정리 훅 추가
왜: 디코딩된 비트맵의 과도한 보존으로 피크 메모리 증가. 전역 상한/만료 설정과 시스템 이벤트 연동으로 안정화 필요. 무엇(`SodaLiveApp.swift`): - `ImageCache.default` 구성 - 메모리: `totalCostLimit=120MB`, `countLimit=200`, `expiration=300s` - 디스크: `sizeLimit=500MB` - 훅 추가 - `didReceiveMemoryWarning` → `clearMemoryCache()` - `didEnterBackground` → `cleanExpiredMemoryCache()` 검증: 앱 기동/백그라운드/포어그라운드 전환 플로우 정상, 빌드 성공.
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import Kingfisher
|
||||||
|
|
||||||
import FBSDKCoreKit
|
import FBSDKCoreKit
|
||||||
import AppsFlyerLib
|
import AppsFlyerLib
|
||||||
@@ -19,11 +20,34 @@ struct SodaLiveApp: App {
|
|||||||
|
|
||||||
@StateObject var canPgPaymentViewModel = CanPgPaymentViewModel()
|
@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 {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup {
|
||||||
ContentView(canPgPaymentViewModel: canPgPaymentViewModel)
|
ContentView(canPgPaymentViewModel: canPgPaymentViewModel)
|
||||||
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
|
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
|
||||||
CreatorCommunityMediaPlayerManager.shared.pauseContent()
|
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
|
.onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in
|
||||||
UIApplication.shared.applicationIconBadgeNumber = 0
|
UIApplication.shared.applicationIconBadgeNumber = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user