iOS数据库离线缓存思路和网络层封装——数据缓存机制Model封装

来源:互联网 发布:宿州智慧云计算产业园 编辑:程序博客网 时间:2024/05/01 23:10

.h文件

#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>/// 缓存策略typedef NS_ENUM(NSInteger, NetworkCacheType){   /// 无视缓存,总是请求最新的数据    NetworkCacheTypeAlways = 1,       /// 缓存过期时,才请求最新的数据    NetworkCacheTypeWhileOverdue,        /// 不做缓存处理    NetworkCacheTypeNever};/// 缓存时间长短 1 weekstatic CGFloatconst NetworkCacheTimeWeek = (60 *60 * 24 *7);/// 缓存时间长短 1 daystatic CGFloatconst NetworkCacheTimeDay = (60 *60 * 24 *1);@interface SYNetworkCache :NSObject///缓存时的日期@property (nonatomic,strong) NSDate *cacheDate;///缓存有效期@property (nonatomic,strong) NSNumber *cacheValiditySeconds;///缓存过期日期@property (nonatomic,strong) NSDate *cacheOverdueDate;/// 缓存内容@property (nonatomic,strong) NSData *cacheData;/// 缓存key值@property (nonatomic,strong) NSString *cacheKey;/// 单例+ (SYNetworkCache *)shareCache;/// 缓存数据- (void)saveNetworkCacheData:(NSData *)responseData cachekey:(NSString *)urlKey cacheTime:(NSTimeInterval)expiresInSeconds;///获取指定缓存数据- (NSData *)getNetworkCacheContentWithCacheKey:(NSString *)urlKey;///清除指定的数据- (void)deleteNetworkCacheWithKey:(NSString *)urlKey;///计算缓存数据库文件大小- (NSString *)networkCacheSize;///清除缓存(是否删除表)- (void)networkCacehClear:(BOOL)dropTable;@end


.m文件

#import "SYNetworkCache.h"#import <CommonCrypto/CommonDigest.h>#import "SYFMDBManager.h"@interface SYNetworkCache ()@end@implementation SYNetworkCache// 初始化- (instancetype)init{    self = [superinit];    if (self)    {        [[SYFMDBManagershareFMDB] createTable:[SYNetworkCacheclass]];    }        returnself;}- (void)dealloc{    }#pragma mark - 单例// 单例+ (SYNetworkCache *)shareCache{    staticSYNetworkCache *sharedManager;    staticdispatch_once_t onceToken;        dispatch_once(&onceToken, ^{        sharedManager = [[selfalloc] init];        assert(sharedManager !=nil);    });        return sharedManager;}#pragma mark - 数据缓存/// 缓存数据- (void)saveNetworkCacheData:(NSData *)responseData cachekey:(NSString *)urlKey cacheTime:(NSTimeInterval)expiresInSeconds{    SYNetworkCache *downloadCache = [[SYNetworkCachealloc] init];    downloadCache.cacheKey = urlKey;    downloadCache.cacheDate = [NSDatedate];    downloadCache.cacheValiditySeconds = [NSNumbernumberWithDouble:expiresInSeconds];    downloadCache.cacheData = responseData;    downloadCache.cacheOverdueDate = [[NSDatedate] dateByAddingTimeInterval:expiresInSeconds];        // 保存    [[SYFMDBManagershareFMDB] saveDataWithData:downloadCache];}#pragma mark - 数据读取///获取指定缓存数据- (NSData *)getNetworkCacheContentWithCacheKey:(NSString *)urlKey{    if (urlKey)    {        SYNetworkCache *cache;        NSArray *array = [[SYFMDBManagershareFMDB] getAllDataWithClass:[SYNetworkCacheclass]];        NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"cacheKey == %@",urlKey];        NSArray *results = [arrayfilteredArrayUsingPredicate:predicate];        cache = results.firstObject;                NSDate *expiryDate = cache.cacheOverdueDate;                // 存储的数据已过期        NSComparisonResult compareResult = [[NSDatedate] compare:expiryDate];        if (NSOrderedDescending == compareResult)        {            // 删除过期数据            [selfdeleteNetworkCacheWithKey:urlKey];                        returnnil;        }                NSData *content = cache.cacheData;        return content;    }        returnnil;}#pragma mark - 数据清除///清除指定的数据- (void)deleteNetworkCacheWithKey:(NSString *)urlKey{    if (urlKey ==nil)    {        return;    }        SYNetworkCache *cache;    NSArray *array = [[SYFMDBManagershareFMDB] getAllDataWithClass:[SYNetworkCacheclass]];    NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"cacheKey == %@",urlKey];    NSArray *results = [arrayfilteredArrayUsingPredicate:predicate];    cache = results.firstObject;        [[SYFMDBManagershareFMDB] deleteDataWithData:cache];}/// 清除内存- (void)networkCacheClearMemory{    // won't be able to complete}///清除所有的缓存- (void)networkCacheClearAll{    [[SYFMDBManagershareFMDB] deleteAllData];}///计算缓存数据库文件大小- (NSString *)networkCacheSize{    NSUInteger size =0;    NSArray *array = [[SYFMDBManagershareFMDB] getAllDataWithClass:[SYNetworkCacheclass]];    for (SYNetworkCache *modelin array)    {        NSData *cacheData = model.cacheData;        NSUInteger cacheSize = cacheData.length;        size += cacheSize;    }        NSString *sizeStr = [NSStringstringWithFormat:@"%ldB", size];    if (size >1024 * 1024)    {        size = size / 1024 *1024;        sizeStr = [NSStringstringWithFormat:@"%ldM", size];    }    elseif (size > 1024)    {        size = size / 1024;        sizeStr = [NSStringstringWithFormat:@"%ldKB", size];    }        return sizeStr;}///清除缓存(是否删除表)- (void)networkCacehClear:(BOOL)dropTable{    [[SYFMDBManagershareFMDB] deleteAllData:^{        if (dropTable)        {            [[SYFMDBManagershareFMDB] dropTable:[SYNetworkCacheclass]];        }    }];}@end






0 0
原创粉丝点击