mirror of
https://github.com/yattee/yattee.git
synced 2026-02-20 17:59:45 +00:00
93 lines
2.8 KiB
Swift
93 lines
2.8 KiB
Swift
//
|
|
// ImageLoadingService.swift
|
|
// Yattee
|
|
//
|
|
// Configures Nuke's ImagePipeline for app-wide image loading.
|
|
//
|
|
|
|
import Foundation
|
|
import Nuke
|
|
|
|
/// Configures and manages the Nuke image loading pipeline.
|
|
@MainActor
|
|
final class ImageLoadingService: Sendable {
|
|
static let shared = ImageLoadingService()
|
|
|
|
private init() {}
|
|
|
|
/// Configure the shared ImagePipeline with app-specific settings.
|
|
/// Call this once at app launch.
|
|
func configure() {
|
|
// Memory cache limits (platform-specific)
|
|
#if os(tvOS)
|
|
let memoryCacheLimit = 50 * 1024 * 1024 // 50 MB
|
|
#else
|
|
let memoryCacheLimit = 100 * 1024 * 1024 // 100 MB
|
|
#endif
|
|
|
|
// Disk cache limits (platform-specific)
|
|
#if os(tvOS)
|
|
let diskCacheLimit = 100 * 1024 * 1024 // 100 MB
|
|
#elseif os(macOS)
|
|
let diskCacheLimit = 500 * 1024 * 1024 // 500 MB
|
|
#else
|
|
let diskCacheLimit = 300 * 1024 * 1024 // 300 MB (iOS)
|
|
#endif
|
|
|
|
// Create data cache
|
|
let dataCache: DataCache? = {
|
|
let cache = try? DataCache(name: "com.yattee.images")
|
|
cache?.sizeLimit = diskCacheLimit
|
|
return cache
|
|
}()
|
|
|
|
// Create image cache (memory)
|
|
let imageCache = Nuke.ImageCache()
|
|
imageCache.costLimit = memoryCacheLimit
|
|
|
|
// Configure pipeline
|
|
var config = ImagePipeline.Configuration()
|
|
config.dataCache = dataCache
|
|
config.imageCache = imageCache
|
|
|
|
// Use default URLSession-based data loader
|
|
config.dataLoader = DataLoader(configuration: .default)
|
|
|
|
// Set as shared pipeline
|
|
ImagePipeline.shared = ImagePipeline(configuration: config)
|
|
|
|
LoggingService.shared.info(
|
|
"Image pipeline configured",
|
|
category: .imageLoading,
|
|
details: "Memory: \(memoryCacheLimit / 1024 / 1024)MB, Disk: \(diskCacheLimit / 1024 / 1024)MB"
|
|
)
|
|
}
|
|
|
|
/// Clear all image caches (memory and disk).
|
|
func clearCache() {
|
|
// Clear memory cache
|
|
ImagePipeline.shared.cache.removeAll()
|
|
|
|
// Clear disk cache
|
|
if let dataCache = ImagePipeline.shared.configuration.dataCache as? DataCache {
|
|
dataCache.removeAll()
|
|
}
|
|
|
|
LoggingService.shared.info("Image cache cleared", category: .imageLoading)
|
|
}
|
|
|
|
/// Returns the disk cache size in bytes.
|
|
func diskCacheSize() -> Int {
|
|
guard let dataCache = ImagePipeline.shared.configuration.dataCache as? DataCache else {
|
|
return 0
|
|
}
|
|
return dataCache.totalSize
|
|
}
|
|
|
|
/// Returns a formatted string of the disk cache size.
|
|
func formattedDiskCacheSize() -> String {
|
|
let size = diskCacheSize()
|
|
return ByteCountFormatter.string(fromByteCount: Int64(size), countStyle: .file)
|
|
}
|
|
}
|