diff --git a/AltStore/AppDelegate.swift b/AltStore/AppDelegate.swift index c78a3585..fc8c84b5 100644 --- a/AltStore/AppDelegate.swift +++ b/AltStore/AppDelegate.swift @@ -16,6 +16,8 @@ import AltSign import Roxas import EmotionalDamage +import Nuke + extension UIApplication: LegacyBackgroundFetching {} extension AppDelegate @@ -60,6 +62,7 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { AnalyticsManager.shared.start() self.setTintColor() + self.prepareImageCache() SecureValueTransformer.register() @@ -143,6 +146,33 @@ private extension AppDelegate self.window?.tintColor = .altPrimary } + func prepareImageCache() + { + // Avoid caching responses twice. + DataLoader.sharedUrlCache.diskCapacity = 0 + + let pipeline = ImagePipeline { configuration in + do + { + let dataCache = try DataCache(name: "io.altstore.Nuke") + dataCache.sizeLimit = 512 * 1024 * 1024 // 512MB + + configuration.dataCache = dataCache + } + catch + { + Logger.main.error("Failed to create image disk cache. Falling back to URL cache. \(error.localizedDescription, privacy: .public)") + } + } + + ImagePipeline.shared = pipeline + + if let dataCache = ImagePipeline.shared.configuration.dataCache as? DataCache, #available(iOS 15, *) + { + Logger.main.info("Current image cache size: \(dataCache.totalSize.formatted(.byteCount(style: .file)), privacy: .public)") + } + } + func open(_ url: URL) -> Bool { if url.isFileURL diff --git a/AltStore/Operations/ClearAppCacheOperation.swift b/AltStore/Operations/ClearAppCacheOperation.swift index b6a36afb..b290856e 100644 --- a/AltStore/Operations/ClearAppCacheOperation.swift +++ b/AltStore/Operations/ClearAppCacheOperation.swift @@ -9,6 +9,9 @@ import Foundation import AltStoreCore /* + +import Nuke + struct BatchError: ALTLocalizedError { @@ -54,6 +57,8 @@ class ClearAppCacheOperation: ResultOperation { super.main() + self.clearNukeCache() + var allErrors = [Error]() self.clearTemporaryDirectory { result in @@ -89,6 +94,12 @@ class ClearAppCacheOperation: ResultOperation private extension ClearAppCacheOperation { + func clearNukeCache() + { + guard let dataCache = ImagePipeline.shared.configuration.dataCache as? DataCache else { return } + dataCache.removeAll() + } + func clearTemporaryDirectory(completion: @escaping (Result) -> Void) { let intent = NSFileAccessIntent.writingIntent(with: FileManager.default.temporaryDirectory, options: [.forDeleting])