Browse Source

Add ExpirationExtending enum to control extending policy

Dominique Stranz 6 years ago
parent
commit
e2877cb2d0

+ 10 - 12
Sources/Cache/MemoryStorage.swift

@@ -131,19 +131,19 @@ public enum MemoryStorage {
         ///     * .never will not extend expiration
         ///     * nil (default value) will use object cache expiration settings
         /// - Returns: cached object or nil
-        func value(forKey key: String, extendingExpiration: StorageExpiration? = nil) -> T? {
+        func value(forKey key: String, extendingExpiration: ExpirationExtending = .cacheTime) -> T? {
             guard let object = storage.object(forKey: key as NSString) else {
                 return nil
             }
             if object.expired {
                 return nil
             }
-            object.extendExpiration(by: extendingExpiration ?? object.expiration)
+            object.extendExpiration(extendingExpiration)
             return object.value
         }
 
         func isCached(forKey key: String) -> Bool {
-            guard let _ = value(forKey: key, extendingExpiration: .never) else {
+            guard let _ = value(forKey: key, extendingExpiration: .none) else {
                 return false
             }
             return true
@@ -222,17 +222,15 @@ extension MemoryStorage {
             
             self.estimatedExpiration = expiration.estimatedExpirationSinceNow
         }
-        
-        func extendExpiration() {
-            extendExpiration(by: expiration)
-        }
-        
-        func extendExpiration(by extendingExpiration: StorageExpiration) {
+
+        func extendExpiration(_ extendingExpiration: ExpirationExtending = .cacheTime) {
             switch extendingExpiration {
-            case .never:
+            case .none:
                 return
-            default:
-                self.estimatedExpiration = extendingExpiration.estimatedExpirationSinceNow
+            case .cacheTime:
+                self.estimatedExpiration = expiration.estimatedExpirationSinceNow
+            case .expirationTime(let expirationTime):
+                self.estimatedExpiration = expirationTime.estimatedExpirationSinceNow
             }
         }
         

+ 14 - 0
Sources/Cache/Storage.swift

@@ -81,6 +81,20 @@ public enum StorageExpiration {
     }
 }
 
+/// Represents the expiration extending strategy used in storage to after access.
+///
+/// - none: The item expires after the original time, without extending after access.
+/// - cacheTime: The item expiration extends by the original cache time after each access.
+/// - expirationTime: The item expiration extends by the privided time after each access.
+public enum ExpirationExtending {
+    /// The item expires after the original time, without extending after access.
+    case none
+    /// The item expiration extends by the original cache time after each access.
+    case cacheTime
+    /// The item expiration extends by the privided time after each access.
+    case expirationTime(_ expiration: StorageExpiration)
+}
+
 /// Represents types which cost in memory can be calculated.
 public protocol CacheCostCalculable {
     var cacheCost: Int { get }

+ 5 - 5
Sources/General/KingfisherOptionsInfo.swift

@@ -204,9 +204,9 @@ public enum KingfisherOptionsInfoItem {
     case memoryCacheExpiration(StorageExpiration)
     
     /// The expiration extending setting for memory cache. The item expiration time will be incremented by this value after access.
-    /// By default, the underlying `MemoryStorage.Backend` uses the initial cache expiration as extending value.
-    /// To disable extending option at all add memoryCacheAccessExtendingExpiration(.never) to options.
-    case memoryCacheAccessExtendingExpiration(StorageExpiration)
+    /// By default, the underlying `MemoryStorage.Backend` uses the initial cache expiration as extending value: .cacheTime.
+    /// To disable extending option at all add memoryCacheAccessExtendingExpiration(.none) to options.
+    case memoryCacheAccessExtendingExpiration(ExpirationExtending)
     
     /// The expiration setting for memory cache. By default, the underlying `DiskStorage.Backend` uses the
     /// expiration in its config for all items. If set, the `DiskStorage.Backend` will use this associated
@@ -257,7 +257,7 @@ public struct KingfisherParsedOptionsInfo {
     public var alsoPrefetchToMemory = false
     public var loadDiskFileSynchronously = false
     public var memoryCacheExpiration: StorageExpiration? = nil
-    public var memoryCacheAccessExtendingExpiration: StorageExpiration? = nil
+    public var memoryCacheAccessExtendingExpiration: ExpirationExtending = .cacheTime
     public var diskCacheExpiration: StorageExpiration? = nil
     public var processingQueue: CallbackQueue? = nil
     public var progressiveJPEG: ImageProgressive? = nil
@@ -296,7 +296,7 @@ public struct KingfisherParsedOptionsInfo {
             case .loadDiskFileSynchronously: loadDiskFileSynchronously = true
             case .callbackDispatchQueue(let value): callbackQueue = value.map { .dispatch($0) } ?? .mainCurrentOrAsync
             case .memoryCacheExpiration(let expiration): memoryCacheExpiration = expiration
-            case .memoryCacheAccessExtendingExpiration(let expiration): memoryCacheAccessExtendingExpiration = expiration
+            case .memoryCacheAccessExtendingExpiration(let expirationExtending): memoryCacheAccessExtendingExpiration = expirationExtending
             case .diskCacheExpiration(let expiration): diskCacheExpiration = expiration
             case .processingQueue(let queue): processingQueue = queue
             case .progressiveJPEG(let value): progressiveJPEG = value

+ 2 - 2
Tests/KingfisherTests/ImageViewExtensionTests.swift

@@ -658,7 +658,7 @@ class ImageViewExtensionTests: XCTestCase {
         let url = testURLs[0]
         stub(url, data: testImageData)
         
-        let options: KingfisherOptionsInfo = [.cacheMemoryOnly, .memoryCacheExpiration(.seconds(1)), .memoryCacheAccessExtendingExpiration(.seconds(100))]
+        let options: KingfisherOptionsInfo = [.cacheMemoryOnly, .memoryCacheExpiration(.seconds(1)), .memoryCacheAccessExtendingExpiration(.expirationTime(.seconds(100)))]
        
         imageView.kf.setImage(with: url, options: options) { result in
             XCTAssertNotNil(result.value?.image)
@@ -693,7 +693,7 @@ class ImageViewExtensionTests: XCTestCase {
         let url = testURLs[0]
         stub(url, data: testImageData)
         
-        let options: KingfisherOptionsInfo = [.cacheMemoryOnly, .memoryCacheExpiration(.seconds(1)), .memoryCacheAccessExtendingExpiration(.never)]
+        let options: KingfisherOptionsInfo = [.cacheMemoryOnly, .memoryCacheExpiration(.seconds(1)), .memoryCacheAccessExtendingExpiration(.none)]
   
         imageView.kf.setImage(with: url, options: options) { result in
             XCTAssertNotNil(result.value?.image)

+ 1 - 3
Tests/KingfisherTests/KingfisherOptionsInfoTests.swift

@@ -88,8 +88,7 @@ class KingfisherOptionsInfoTests: XCTestCase {
             .imageModifier(modifier),
             .keepCurrentImageWhileLoading,
             .onlyLoadFirstFrame,
-            .cacheOriginalImage,
-            .memoryCacheAccessExtendingExpiration(.seconds(1))
+            .cacheOriginalImage
         ])
         
         XCTAssertTrue(options.targetCache === cache)
@@ -110,7 +109,6 @@ class KingfisherOptionsInfoTests: XCTestCase {
         XCTAssertTrue(options.fromMemoryCacheOrRefresh)
         XCTAssertTrue(options.forceTransition)
         XCTAssertTrue(options.cacheMemoryOnly)
-        XCTAssertEqual(options.memoryCacheAccessExtendingExpiration?.timeInterval, 1)
         XCTAssertTrue(options.waitForCache)
         XCTAssertTrue(options.onlyFromCache)
         XCTAssertTrue(options.backgroundDecode)

+ 2 - 2
Tests/KingfisherTests/MemoryStorageTests.swift

@@ -151,7 +151,7 @@ class MemoryStorageTests: XCTestCase {
             XCTAssertNotNil(expirationDate1)
             
             // Request for the object to extend it's expiration date
-            let obj = self.storage.value(forKey: "1", extendingExpiration: .seconds(5))
+            let obj = self.storage.value(forKey: "1", extendingExpiration: .expirationTime(.seconds(5)))
             XCTAssertNotNil(obj)
             
             let expirationDate2 = self.storage.storage.object(forKey: "1")?.estimatedExpiration
@@ -177,7 +177,7 @@ class MemoryStorageTests: XCTestCase {
             XCTAssertNotNil(expirationDate1)
             
             // Request for the object to extend it's expiration date
-            let obj = self.storage.value(forKey: "1", extendingExpiration: .never)
+            let obj = self.storage.value(forKey: "1", extendingExpiration: .none)
             XCTAssertNotNil(obj)
             
             let expirationDate2 = self.storage.storage.object(forKey: "1")?.estimatedExpiration