| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- //
- // UIImage+RedAnt.m
- // Apex And Drivers
- //
- // Created by Jack on 2018/8/29.
- // Copyright © 2018年 USAI. All rights reserved.
- //
- #import "UIImage+RedAnt.h"
- #import <CommonCrypto/CommonCrypto.h>
- static dispatch_semaphore_t _lock;
- #define Lock() dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER)
- #define Unlock() dispatch_semaphore_signal(_lock)
- @implementation UIImage (RedAnt)
- + (void)load {
- _lock = dispatch_semaphore_create(1);
- }
- + (instancetype)ra_imageWithURL:(NSURL *)url {
-
- if (url == nil) {
- return nil;
- }
-
- if ([url.scheme isEqualToString:@"file"]) {
- return [UIImage imageWithContentsOfFile:url.absoluteString];
- }
-
- NSString *md5 = [self md5:url.absoluteString];
-
- NSString *imgDir = [self imageCacheDir];
- NSString *imgPath = [imgDir stringByAppendingPathComponent:md5];
-
- NSFileManager *fileManager = [NSFileManager defaultManager];
-
- BOOL isDir = NO;
- BOOL exist = [fileManager fileExistsAtPath:imgPath isDirectory:&isDir];
-
- if (exist && !isDir) {
- return [UIImage imageWithContentsOfFile:imgPath];
- } else {
-
- NSData *imgData = [NSData dataWithContentsOfURL:url];
-
- exist = [fileManager fileExistsAtPath:imgDir isDirectory:&isDir];
- if ((exist && isDir) || !exist) {
- [fileManager createDirectoryAtPath:imgDir withIntermediateDirectories:YES attributes:nil error:nil];
- }
-
- if (imgData) {
- Lock();
- [imgData writeToFile:imgPath atomically:NO];
- Unlock();
-
- return [UIImage imageWithData:imgData];
- } else {
- return nil;
- }
- }
- }
- + (NSString *)imageCacheDir {
- return [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"ra_image"];
- }
- + (nullable NSString *)md5:(nullable NSString *)str {
- if (!str) return nil;
-
- const char *cStr = str.UTF8String;
- unsigned char result[CC_MD5_DIGEST_LENGTH];
- CC_MD5(cStr, (CC_LONG)strlen(cStr), result);
-
- NSMutableString *md5Str = [NSMutableString string];
- for (int i = 0; i < CC_MD5_DIGEST_LENGTH; ++i) {
- [md5Str appendFormat:@"%02x", result[i]];
- }
- return md5Str;
- }
- @end
|