iOS 之 文件缓存
对于信息量不是太大的数据,可以使用文件缓存来处理。文件缓存可以缓存字典和数组。
步骤一:创建路径
路径要一级一级往下创建,基本不用考虑创建失败的情况。但是如果创建失败了要怎么做呢?按道理应该提示出来。结束往下的操作,因为没有办法继续创建下面的目录。
创建路径要放到~Document下面,在真机上才能运行。
创建路径只是目录,文件名称还要在读写时附加上。
//创建文件管理器 NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL isDirectory; NSError *error = nil; //初始化存储路径 NSString *mapPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/couponCatch"]; if (![fileManager fileExistsAtPath:mapPath isDirectory:&isDirectory]) { [fileManager createDirectoryAtPath:mapPath withIntermediateDirectories:YES attributes:nil error:&error]; }
参数:withIntermediateDirectories ,YES 如果文件夹不存在,则创建, 如果存在表示可以覆盖; NO 如果文件夹不存在,则创建, 如果存在不可以覆盖。
那么覆盖路径,也算是删除路径下的所有文件了。上面代码中,可以不用判断,直接创建就可以了,只是把withIntermediateDirectories设置成NO,就可以了。设置成YES的时候,表示要删除其下的文件夹和文件,慎用。
步骤二:写文件
写文件是用NSArchive来归档,该类可以归档任何类型。
归档文件有两种接口:
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self]; BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES];
[NSKeyedArchiver archiveRootObject:<#(nonnull id)#> toFile:<#(nonnull NSString *)#>]
看上去,这两种接口差别不大,第二种更像是第一种的组合版本。第一种多了一个参数,atomically,原子级。不知道这有什么作用。
步骤三:读文件
NSData * data = [NSData dataWithContentsOfFile:path]; [NSKeyedUnarchiver unarchiveObjectWithData:data];
删除文件
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; NSEnumerator *eDir = [contents objectEnumerator]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString* fileName; while (fileName = [eDir nextObject]) { if (fileName!=nil) { [fileManager removeItemAtPath:[path stringByAppendingPathComponent:fileName] error:NULL]; } }