1.先来一张流程图:
流程图.png2.上代码:
2.1工具类核心方法:
typedef NS_ENUM(NSUInteger, YBCacheType){
YBCacheTypeReturnCacheDataThenLoad = 0,///< 有缓存就先返回缓存,同步请求数据
YBCacheTypeReloadIgnoringLocalCacheData, ///< 忽略缓存,重新请求
YBCacheTypeReturnCacheDataElseLoad,///< 有缓存就用缓存,没有缓存就重新请求(用于数据不变时)
YBCacheTypeReturnCacheDataDontLoad,///< 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
YBCacheTypeReturnCacheDataExpireThenLoad///< 有缓存就用缓存,如果过期了就重新请求 没过期就不请求
};
@interface YBCacheTool : NSObject
/**
* 缓存数据
*
* @param fileName 缓存数据的文件名
*
* @param data 需要缓存的二进制
*/
+ (void)cacheForData:(NSData *)data fileName:(NSString *)fileName;
/**
* 取出缓存数据
*
* @param fileName 缓存数据的文件名
*
* @return 缓存的二进制数据
*/
+ (NSData *)getCacheFileName:(NSString *)fileName;
/**
* 判断缓存文件是否过期
*/
+ (BOOL)isExpire:(NSString *)fileName;
/**
* 获取缓存的大小
*
* @return 缓存的大小 单位是B
*/
+ (NSUInteger)getSize;
/**
* 清除缓存
*/
+ (void)clearCache;
2.2方法实现:
@implementation YBCacheTool
+ (void)cacheForData:(NSData *)data fileName:(NSString *)fileName
{
NSString *path = [kCachePath stringByAppendingPathComponent:[YBMD5 md5:fileName]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[data writeToFile:path atomically:YES];
});
}
+ (NSData *)getCacheFileName:(NSString *)fileName
{
NSString *path = [kCachePath stringByAppendingPathComponent:[YBMD5 md5:fileName]];
return [[NSData alloc] initWithContentsOfFile:path];
}
+ (NSUInteger)getAFNSize
{
NSUInteger size = 0;
NSFileManager *fm = [NSFileManager defaultManager];
NSDirectoryEnumerator *fileEnumerator = [fm enumeratorAtPath:kCachePath];
for (NSString *fileName in fileEnumerator) {
NSString *filePath = [kCachePath stringByAppendingPathComponent:fileName];
NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
size += [attrs fileSize];
}
return size;
}
+ (NSUInteger)getSize
{
//获取AFN的缓存大小
NSUInteger afnSize = [self getAFNSize];
return afnSize;
}
+ (void)clearAFNCache
{
NSFileManager *fm = [NSFileManager defaultManager];
NSDirectoryEnumerator *fileEnumerator = [fm enumeratorAtPath:kCachePath];
for (NSString *fileName in fileEnumerator) {
NSString *filePath = [kCachePath stringByAppendingPathComponent:fileName];
[fm removeItemAtPath:filePath error:nil];
}
}
+ (void)clearCache
{
[self clearAFNCache];
}
+ (BOOL)isExpire:(NSString *)fileName
{
NSString *path = [kCachePath stringByAppendingPathComponent:[YBMD5 md5:fileName]];
NSFileManager *fm = [NSFileManager defaultManager];
NSDictionary *attributesDict = [fm attributesOfItemAtPath:path error:nil];
NSDate *fileModificationDate = attributesDict[NSFileModificationDate];
NSTimeInterval fileModificationTimestamp = [fileModificationDate timeIntervalSince1970];
//现在的时间戳
NSTimeInterval nowTimestamp = [[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970];
return ((nowTimestamp-fileModificationTimestamp)>kYBCache_Expire_Time);
}
根据需求自己对AFN进行二次封装,在回调里调用缓存工具方法。
Demo的git地址:https://github.com/walkingzmz/MZAFNetworking
原文链接,请支持原作者:https://www.cnblogs.com/walkingzmz/p/6051377.html
网友评论