LeslieImageCache.m 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //
  2. // LeslieImageCache.m
  3. // AsyncUIImageView
  4. //
  5. // Created by Leslie.Fang on 14-8-11.
  6. // Copyright (c) 2017年 Enway. All rights reserved.
  7. //
  8. #import "LeslieImageCache.h"
  9. @implementation LeslieImageCache
  10. + (LeslieImageCache*)sharedCache {
  11. static LeslieImageCache *imageCache = nil;
  12. static dispatch_once_t onceToken;
  13. dispatch_once(&onceToken, ^{
  14. imageCache = [[self alloc] init];
  15. });
  16. return imageCache;
  17. }
  18. - (id)init{
  19. if (self == [super init]) {
  20. ioQueue = dispatch_queue_create("com.leslie.LeslieImageCache", DISPATCH_QUEUE_SERIAL);
  21. memCache = [[NSCache alloc] init];
  22. memCache.name = @"image_cache";
  23. fileManager = [NSFileManager defaultManager];
  24. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  25. cacheDir = [[paths objectAtIndex:0] stringByAppendingPathComponent:IBOSSIMAGE];
  26. NSFileManager *fileManager = [NSFileManager defaultManager];
  27. BOOL isDir = NO;
  28. // fileExistsAtPath 判断一个文件或目录是否有效,isDirectory判断是否一个目录
  29. BOOL existed = [fileManager fileExistsAtPath:cacheDir isDirectory:&isDir];
  30. if ( !(isDir == YES && existed == YES) ) {
  31. // 在 Document 目录下创建一个 head 目录
  32. [fileManager createDirectoryAtPath:cacheDir withIntermediateDirectories:YES attributes:nil error:nil];
  33. }
  34. }
  35. return self;
  36. }
  37. +(LeslieImageCache*)sharedCacheMultiple {
  38. static LeslieImageCache *imageCache = nil;
  39. static dispatch_once_t onceToken;
  40. dispatch_once(&onceToken, ^{
  41. imageCache = [[self alloc] init];
  42. });
  43. return imageCache;
  44. }
  45. - (void)cacheImageToMemory:(UIImage*)image forKey:(NSString*)key{
  46. if (image) {
  47. [memCache setObject:image forKey:key];
  48. }
  49. }
  50. -(NSString*) getImageNameFromFileForKey:(NSString*)key{
  51. if (!key) {
  52. return nil;
  53. }
  54. NSRange range = [key rangeOfString:@"/" options:NSBackwardsSearch];
  55. NSString *filename = [key substringFromIndex:range.location+1];
  56. NSString *filepath = [cacheDir stringByAppendingPathComponent:filename];
  57. return filepath;
  58. }
  59. - (UIImage*)getImageFromMemoryForkey:(NSString*)key{
  60. return [memCache objectForKey:key];
  61. }
  62. - (void)cacheImageToFile:(UIImage*)image forKey:(NSString*)key ofType:(NSString*)imageType{
  63. if (!image || !key ||!imageType) {
  64. return;
  65. }
  66. dispatch_async(ioQueue, ^{
  67. NSRange range = [key rangeOfString:@"/" options:NSBackwardsSearch];
  68. NSString *filename = [key substringFromIndex:range.location+1];
  69. NSString *filepath = [cacheDir stringByAppendingPathComponent:filename];
  70. NSData *data = nil;
  71. if ([imageType isEqualToString:@"jpg"]) {
  72. data = UIImageJPEGRepresentation(image, 1.0);
  73. }else{
  74. data = UIImagePNGRepresentation(image);
  75. }
  76. if (data) {
  77. [data writeToFile:filepath atomically:YES];
  78. }
  79. });
  80. }
  81. - (UIImage*)getImageFromFileForKey:(NSString*)key{
  82. if (!key) {
  83. return nil;
  84. }
  85. NSRange range = [key rangeOfString:@"/" options:NSBackwardsSearch];
  86. NSString *filename = [key substringFromIndex:range.location+1];
  87. NSString *filepath = [cacheDir stringByAppendingPathComponent:filename];
  88. if ([fileManager fileExistsAtPath:filepath]) {
  89. UIImage *image = [UIImage imageWithContentsOfFile:filepath];
  90. return image;
  91. }
  92. return nil;
  93. }
  94. - (NSString*)getImagePathFromFileForKey:(NSString*)key{
  95. if (!key) {
  96. return nil;
  97. }
  98. NSRange range = [key rangeOfString:@"/" options:NSBackwardsSearch];
  99. NSString *filename = [key substringFromIndex:range.location+1];
  100. NSString *filepath = [cacheDir stringByAppendingPathComponent:filename];
  101. if ([fileManager fileExistsAtPath:filepath]) {
  102. return filepath;
  103. }
  104. return nil;
  105. }
  106. - (NSString*)writeImageToFile:(UIImage*)image forKey:(NSString*)key ofType:(NSString*)imageType{
  107. if (!image || !key ||!imageType) {
  108. return nil;
  109. }
  110. NSRange range = [key rangeOfString:@"/" options:NSBackwardsSearch];
  111. NSString *filename = [key substringFromIndex:range.location+1];
  112. NSString *filepath = [cacheDir stringByAppendingPathComponent:filename];
  113. NSData *data = nil;
  114. if ([imageType isEqualToString:@"jpg"]) {
  115. data = UIImageJPEGRepresentation(image, 1.0);
  116. }else{
  117. data = UIImagePNGRepresentation(image);
  118. }
  119. if (data) {
  120. [data writeToFile:filepath atomically:YES];
  121. }
  122. return filepath;
  123. }
  124. @end