From a8ba2acc09bc7fba7f01b0e8a8d9ebcd0b8e35ad Mon Sep 17 00:00:00 2001 From: Vong Date: Sat, 20 Jul 2019 23:11:22 +0800 Subject: [PATCH] optimize cache size calculation --- .../Components/Cache/LKImageMemoryCache.mm | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/LKImageKit/Components/Cache/LKImageMemoryCache.mm b/LKImageKit/Components/Cache/LKImageMemoryCache.mm index 7dbbb3c..0bb767f 100644 --- a/LKImageKit/Components/Cache/LKImageMemoryCache.mm +++ b/LKImageKit/Components/Cache/LKImageMemoryCache.mm @@ -19,6 +19,7 @@ { string key; UIImage *image; + int64_t cost; }; struct ImagePointer @@ -38,6 +39,8 @@ @interface LKImageMemoryCache () map imageMap; } +@property (nonatomic, assign) int64_t currentCost; + @end @implementation LKImageMemoryCache @@ -84,6 +87,7 @@ - (void)clear FIFOQueue.clear(); LRUQueue.clear(); imageMap.clear(); + self.currentCost = 0; } - (void)clearWithURL:(NSString *)URL @@ -111,7 +115,10 @@ - (void)deleteCache:(string)key return; } ImagePointer *ptr = it->second; + ImageNode *node = *ptr->it; + self.currentCost -= node->cost; delete *(ptr->it); + delete node; if (ptr->isLRUQueue) { LRUQueue.erase(ptr->it); @@ -136,7 +143,7 @@ - (NSString *)keyForURL:(NSString *)URL - (void)limitCacheSize { - while (self.cacheSize > self.cacheSizeLimit) + while (self.currentCost > self.cacheSizeLimit) { [self clearLastOne]; } @@ -160,6 +167,7 @@ - (void)clearLastOneInLRU { ImageNode *node = *LRUQueue.begin(); LRUQueue.pop_front(); + self.currentCost -= node->cost; auto it = imageMap.find(node->key); delete it->second; delete node; @@ -173,6 +181,7 @@ - (void)clearLastOneInFIFO { ImageNode *node = *FIFOQueue.begin(); FIFOQueue.pop_front(); + self.currentCost -= node->cost; auto it = imageMap.find(node->key); delete it->second; delete node; @@ -185,11 +194,13 @@ - (void)cacheImage:(UIImage *)image URL:(NSString *)URL NSString *key = [self keyForURL:URL]; ImagePointer *ptr = NULL; auto it = imageMap.find([key cStringUsingEncoding:NSUTF8StringEncoding]); + int64_t cost = [self imageSize:image accurate:NO]; if (it == imageMap.end()) { ImageNode *node = new ImageNode(); ptr = new ImagePointer(); node->image = image; + node->cost = cost; node->key = [key cStringUsingEncoding:NSUTF8StringEncoding]; ptr->it = FIFOQueue.insert(FIFOQueue.end(), node); imageMap[node->key] = ptr; @@ -197,16 +208,21 @@ - (void)cacheImage:(UIImage *)image URL:(NSString *)URL { ImageNode *node = *FIFOQueue.begin(); FIFOQueue.pop_front(); + self.currentCost -= node->cost; auto it = imageMap.find(node->key); delete it->second; delete node; imageMap.erase(it); } + self.currentCost += cost; } else { ptr = it->second; (*ptr->it)->image = image; + self.currentCost -= (*ptr->it)->cost; + (*ptr->it)->cost = cost; + self.currentCost += cost; [self visit:key]; } [self limitCacheSize]; @@ -247,7 +263,7 @@ - (int64_t)imageSize:(UIImage*)image accurate:(BOOL)accurate - (int64_t)cacheSize { - return [self cacheSize:NO]; + return self.currentCost; } - (int64_t)cacheSize:(BOOL)accurate