Ver Fonte

Extract storage creation methods

onevcat há 5 anos atrás
pai
commit
6cc54e0896
2 ficheiros alterados com 23 adições e 6 exclusões
  1. 6 2
      Sources/Cache/DiskStorage.swift
  2. 17 4
      Sources/Cache/ImageCache.swift

+ 6 - 2
Sources/Cache/DiskStorage.swift

@@ -56,7 +56,7 @@ public enum DiskStorage {
         /// - Throws: An error if the folder for storage cannot be got or created.
         public init(config: Config) throws {
 
-            self.config = config
+            var config = config
 
             let url: URL
             if let directory = config.directory {
@@ -72,8 +72,12 @@ public enum DiskStorage {
             let cacheName = "com.onevcat.Kingfisher.ImageCache.\(config.name)"
             directoryURL = config.cachePathBlock(url, cacheName)
 
-            metaChangingQueue = DispatchQueue(label: cacheName)
+            // Break any possible retain cycle set by outside.
+            config.cachePathBlock = nil
 
+            self.config = config
+
+            metaChangingQueue = DispatchQueue(label: cacheName)
             try prepareDirectory()
 
             maybeCachedCheckingQueue.async {

+ 17 - 4
Sources/Cache/ImageCache.swift

@@ -239,11 +239,27 @@ open class ImageCache {
             fatalError("[Kingfisher] You should specify a name for the cache. A cache with empty name is not permitted.")
         }
 
+        let memoryStorage = ImageCache.createMemoryStorage()
+        let diskStorage = try ImageCache.createDiskStorage(
+            name: name, cacheDirectoryURL: cacheDirectoryURL, diskCachePathClosure: diskCachePathClosure
+        )
+        self.init(memoryStorage: memoryStorage, diskStorage: diskStorage)
+    }
+
+    private static func createMemoryStorage() -> MemoryStorage.Backend<KFCrossPlatformImage> {
         let totalMemory = ProcessInfo.processInfo.physicalMemory
         let costLimit = totalMemory / 4
         let memoryStorage = MemoryStorage.Backend<KFCrossPlatformImage>(config:
             .init(totalCostLimit: (costLimit > Int.max) ? Int.max : Int(costLimit)))
+        return memoryStorage
+    }
 
+    private static func createDiskStorage(
+        name: String,
+        cacheDirectoryURL: URL?,
+        diskCachePathClosure: DiskCachePathClosure? = nil
+    ) throws -> DiskStorage.Backend<Data>
+    {
         var diskConfig = DiskStorage.Config(
             name: name,
             sizeLimit: 0,
@@ -252,10 +268,7 @@ open class ImageCache {
         if let closure = diskCachePathClosure {
             diskConfig.cachePathBlock = closure
         }
-        let diskStorage = try DiskStorage.Backend<Data>(config: diskConfig)
-        diskConfig.cachePathBlock = nil
-
-        self.init(memoryStorage: memoryStorage, diskStorage: diskStorage)
+        return try DiskStorage.Backend<Data>(config: diskConfig)
     }
     
     deinit {