YBIBImageCache.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // YBIBImageCache.m
  3. // YBImageBrowserDemo
  4. //
  5. // Created by 波儿菜 on 2019/6/13.
  6. // Copyright © 2019 波儿菜. All rights reserved.
  7. //
  8. #import "YBIBImageCache.h"
  9. #import "YBIBImageCache+Internal.h"
  10. #import "YBIBUtilities.h"
  11. #import <objc/runtime.h>
  12. @implementation NSObject (YBIBImageCache)
  13. static void *YBIBImageCacheKey = &YBIBImageCacheKey;
  14. - (void)setYbib_imageCache:(YBIBImageCache *)ybib_imageCache {
  15. objc_setAssociatedObject(self, YBIBImageCacheKey, ybib_imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  16. }
  17. - (YBIBImageCache *)ybib_imageCache {
  18. YBIBImageCache *cache = objc_getAssociatedObject(self, YBIBImageCacheKey);
  19. if (!cache) {
  20. cache = [YBIBImageCache new];
  21. self.ybib_imageCache = cache;
  22. }
  23. return cache;
  24. }
  25. @end
  26. @interface YBIBImageCachePack : NSObject
  27. @property (nonatomic, strong) UIImage *originImage;
  28. @property (nonatomic, strong) UIImage *compressedImage;
  29. @end
  30. @implementation YBIBImageCachePack
  31. @end
  32. @implementation YBIBImageCache {
  33. NSCache<NSString *, YBIBImageCachePack *> *_imageCache;
  34. NSMutableDictionary<NSString *, YBIBImageCachePack *> *_residentCache;
  35. }
  36. #pragma mark - life cycle
  37. - (void)dealloc {
  38. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
  39. }
  40. - (instancetype)init {
  41. self = [super init];
  42. if (self) {
  43. _imageCache = [NSCache new];
  44. _imageCache.countLimit = _imageCacheCountLimit = YBIBLowMemory() ? 6 : 12;
  45. _residentCache = [NSMutableDictionary dictionary];
  46. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
  47. }
  48. return self;
  49. }
  50. #pragma mark - event
  51. - (void)didReceiveMemoryWarning:(NSNotification *)notification {
  52. [_imageCache removeAllObjects];
  53. [_residentCache removeAllObjects];
  54. }
  55. #pragma mark - public
  56. - (void)setImage:(UIImage *)image type:(YBIBImageCacheType)type forKey:(NSString *)key resident:(BOOL)resident {
  57. YBIBImageCachePack *pack = [_imageCache objectForKey:key];
  58. if (!pack) {
  59. pack = [YBIBImageCachePack new];
  60. [_imageCache setObject:pack forKey:key];
  61. }
  62. switch (type) {
  63. case YBIBImageCacheTypeOrigin:
  64. pack.originImage = image;
  65. break;
  66. case YBIBImageCacheTypeCompressed:
  67. pack.compressedImage = image;
  68. break;
  69. }
  70. [_residentCache setObject:pack forKey:key];
  71. }
  72. - (UIImage *)imageForKey:(NSString *)key type:(YBIBImageCacheType)type {
  73. YBIBImageCachePack *pack = [_imageCache objectForKey:key] ?: [_residentCache objectForKey:key];
  74. switch (type) {
  75. case YBIBImageCacheTypeOrigin: return pack.originImage;
  76. case YBIBImageCacheTypeCompressed: return pack.compressedImage;
  77. default: return nil;
  78. }
  79. }
  80. - (void)removeForKey:(NSString *)key {
  81. [_imageCache removeObjectForKey:key];
  82. [_residentCache removeObjectForKey:key];
  83. }
  84. - (void)removeResidentForKey:(NSString *)key {
  85. [_residentCache removeObjectForKey:key];
  86. }
  87. #pragma mark - setter
  88. - (void)setImageCacheCountLimit:(NSUInteger)imageCacheCountLimit {
  89. _imageCacheCountLimit = imageCacheCountLimit;
  90. _imageCache.countLimit = imageCacheCountLimit;
  91. }
  92. @end