美文网首页
AFNetworking之缓存篇-缓存app首页及其他页面

AFNetworking之缓存篇-缓存app首页及其他页面

作者: sjaljlajslkf | 来源:发表于2018-05-15 15:14 被阅读20次

    1.先来一张流程图:

    流程图.png

    2.上代码:

    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

    相关文章

      网友评论

          本文标题:AFNetworking之缓存篇-缓存app首页及其他页面

          本文链接:https://www.haomeiwen.com/subject/wtzedftx.html