開發(fā)中有些界面是永遠不能空著 及時是在沒有網(wǎng)絡(luò)的或者網(wǎng)絡(luò)很弱的情況下都需要有數(shù)據(jù)顯示寿酌,
這就需要給APP做緩存,當(dāng)然緩存有很多種方式,比如 數(shù)據(jù)庫來做低千、比如用緩存文件來做、等等!
記錄一下我自己做緩存的方式
1.如果我用AFNetworking 做數(shù)據(jù)請求和 UIKit+AFNetworking 做圖片異步加載 示血,那么這些異步加載完成后的圖片就會保存一份在沙盒的cache文件加中棋傍。 有了這樣的前提,做文件緩存就方便了很多了难审!
做文件緩存 首先在每次請求到網(wǎng)絡(luò)數(shù)據(jù)(json)之后 直接將這個數(shù)據(jù)(json)保存起來瘫拣。當(dāng)下次讀取數(shù)據(jù)的時候 直接拿到上次保存的數(shù)據(jù)(json),就拿到上次請求的所有信息。然后按照請求的得到數(shù)據(jù)后的邏輯做一遍 告喊,可以將緩存中的內(nèi)容展示在界面上啦麸拄!
(圖片 AFN 會自動緩存在cache文件夾中 AFN 網(wǎng)絡(luò)異步加載圖片的順序 1.在內(nèi)存中查找有沒有緩存,如果有直接拿緩存的數(shù)據(jù)使用不在請求 2.如果沒有找到相應(yīng)的數(shù)據(jù)在從網(wǎng)上請求數(shù)據(jù) 基于這個原理 我就不用緩存圖片了)
/**
寫入緩存
@param data 寫入的數(shù)據(jù)
@param name 寫入的文件名稱
@return 是否寫入成功
*/
+(BOOL)writeToCacheFile:(id)data fileName:(NSString *)name;
#pragma mark - 向緩存中寫入 數(shù)據(jù)(json)
+(BOOL)writeToCacheFile:(id)data fileName:(NSString *)name{
if (!data)
return NO;
NSString *lib_cash = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cachePath = [lib_cash stringByAppendingPathComponent:name];
NSData *cashData = [NSKeyedArchiver archivedDataWithRootObject:data];
BOOL flag = [[NSFileManager defaultManager] createFileAtPath:cachePath contents:cashData attributes:nil];
return flag;
}
/**
讀取緩存中的內(nèi)容
@param pathName 保存時 的文件名稱
@param callback 返回是否 讀取成功 如果成功 返回讀取出來的數(shù)據(jù)
*/
+(void)readData_path:(NSString *)pathName callback:(void (^)(BOOL isSuccess,id response))callback;
#pragma mark - 從緩存中讀取數(shù)據(jù)(json)
+(void)readData_path:(NSString *)pathName callback:(void (^)(BOOL isSuccess,id response))callback{
NSString *document = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cachePath = [document stringByAppendingPathComponent:pathName];
NSData *data = [NSData dataWithContentsOfFile:cachePath];
if (!data) {
callback(NO,nil);
return;
}
id cashData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (cashData)
callback(YES,cashData);
else
callback(NO,nil);
}
這樣的緩存方式僅限與 數(shù)據(jù)量小的情況 黔姜!
一些和緩存相關(guān)的方法
/**
計算沙盒中Cache 文件夾的大小
@return 計算結(jié)果 eg:53 M
*/
+(NSString *)calculate_Size_Of_Cache_File;
#pragma mark - 計算沙盒中Cache 文件夾的大小
+(NSString *)calculate_Size_Of_Cache_File{
NSString *lib_cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
float totalSize = 0;
NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:lib_cache];
for (NSString *fileName in fileEnumerator) {
NSString *filePath = [lib_cache stringByAppendingPathComponent:fileName];
NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
unsigned long long length = [attrs fileSize];
totalSize += length / 1024.0 / 1024.0;
}
return [NSString stringWithFormat:@"%.2f M",totalSize];
}
/**
清理緩存(刪除cache文件中 的內(nèi)容和所有子文件)
*/
+(void)clean_All_Cache_infos;
#pragma mark - 清理所有的緩存信息
+(void)clean_All_Cache_infos{
//刪除cache文件夾下所有的子文件
NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) firstObject];
NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath];
for (NSString *subFile in files) {
NSError *error;
NSString *path = [cachPath stringByAppendingPathComponent:subFile];
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
[[NSFileManager defaultManager] removeItemAtPath:path error:&error];
}
}
}