From 4d5326b8c59990f5a77ee43273f48487939c84e2 Mon Sep 17 00:00:00 2001 From: Richard Gravenor Date: Wed, 3 Apr 2019 15:34:47 +0100 Subject: [PATCH] Retain cache hits in memory when loaded from disk --- AwesomeCache/Cache.swift | 12 ++++++++---- AwesomeCacheTests/AwesomeCacheTests.swift | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/AwesomeCache/Cache.swift b/AwesomeCache/Cache.swift index 6da0abd..e9b2d36 100644 --- a/AwesomeCache/Cache.swift +++ b/AwesomeCache/Cache.swift @@ -235,11 +235,15 @@ open class Cache { // Otherwise, read from disk let path = urlForKey(key).path - if fileManager.fileExists(atPath: path) { - return _awesomeCache_unarchiveObjectSafely(path) as? CacheObject + guard + fileManager.fileExists(atPath: path), + let object = _awesomeCache_unarchiveObjectSafely(path) as? CacheObject else { + return nil } - - return nil + + // Keep in memory: + cache.setObject(object, forKey: key as NSString) + return object } // Deletes an object from disk diff --git a/AwesomeCacheTests/AwesomeCacheTests.swift b/AwesomeCacheTests/AwesomeCacheTests.swift index 4f450c2..a67a813 100644 --- a/AwesomeCacheTests/AwesomeCacheTests.swift +++ b/AwesomeCacheTests/AwesomeCacheTests.swift @@ -30,6 +30,21 @@ class AwesomeCacheTests: XCTestCase { XCTAssertNotNil(cache.object(forKey: "add"), "Added object should not be nil") XCTAssertEqual("AddedString", cache.object(forKey: "add")!, "Fetched object should be equal to the inserted object") } + + func testObjectIsRetainedInMemoryWhenLoadedFromDisk() { + let cache = try! Cache(name: "testObjectMemoryRetention") + + //Add to cache, both in-memory and on-disk: + cache.setObject("AddedString", forKey: "add") + + //purge in-memory cache + cache.cache.removeAllObjects() + + //load from disk + _ = cache.object(forKey: "add") + + XCTAssertTrue(cache.isOnMemory(forKey: "add"), "Cached object should be loaded from disk and retained in memory") + } func testGetExpiredObjectIfPresent() { let cache = try! Cache(name: "testGetExpiredObject")