/**
* 缓存model 的方法 。
*/
TestModelObject *testModel = [TestModelObjectmodelWithDictionary:dict];
NSMutableArray * dataArray = [NSMutableArrayarrayWithCapacity:50];
//将testModel类型变为NSData类型
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:testModel];
//存放数据的数组将data加入进去
[dataArray addObject:data];
//记住要转换成不可变数组类型
NSArray * array = [NSArray arrayWithArray:dataArray];
NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];
[user setObject:array forKey:@"testModelArray"];
NSArray *resultArray = [user objectForKey:@"testModelArray"];
TestModelObject *resultModel = [NSKeyedUnarchiver unarchiveObjectWithData:[resultArray objectAtIndex:0]];
NSLog(@"====%@,%d",resultModel.girl1,resultModel.age);
NSMutableData *data = [NSMutableDatadata];
NSKeyedArchiver *archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data];
[archiver encodeObject:self.myDataArrayforKey:@"myArchiverDataKey"];
[archiver finishEncoding];
if ([ToolessaveFileToLoc:@"myFriendsList"theFile:data]) {
DDLogDebug(@"保存成");
}else{
DDLogDebug(@"保存失败");
}
dispatch_async(dispatch_get_main_queue(), ^{
[wSelf myReloadTableView];
});
});
}else{
NSData *myData = [NSDatadata];
self.myFriendListData = [NSDatadataWithData:[ToolesgetDataFileFromLoc:@"myFriendsList"into:myData]];
if (self.myFriendListData.length > 0) {
DDLogDebug(@"获取成功");
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:self.myFriendListData];
self.myDataArray = [unarchiver decodeObjectForKey:@"myArchiverDataKey"];
}else{
DDLogDebug(@"获取失败.");
}
#pragma mark - 下面两个方法可以存储自定义的对象---TMCache就不行。
+(BOOL)saveFileToLoc:(NSString *) fileName theFile:(id) file{
NSString *Path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *CachePath = [fileName stringByReplacingOccurrencesOfString: @"/"withString: @"_"];
NSString *filename=[Path stringByAppendingPathComponent:CachePath];
NSFileManager *fileManager = [NSFileManagerdefaultManager];
if (![fileManager fileExistsAtPath:filename]) {
if (! [fileManager createFileAtPath:filename contents:nilattributes:nil]) {
NSLog(@"createFile error occurred");
}
}
return [file writeToFile:filename atomically:YES];
}
+(BOOL) getFileFromLoc:(NSString*)filePath into:(id)file {
NSString *Path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *CachePath = [filePath stringByReplacingOccurrencesOfString: @"/"withString: @"_"];
NSString *filename=[Path stringByAppendingPathComponent:CachePath];
if ([file isKindOfClass:[NSMutableDictionaryclass]]) {
[file setDictionary: [NSMutableDictionarydictionaryWithContentsOfFile:filename]];
if ([file count]==0) {
returnNO;
}
}elseif ([file isKindOfClass:[NSMutableArrayclass]]) {
[file addObjectsFromArray: [NSMutableArrayarrayWithContentsOfFile:filename]];
if ([file count]==0) {
returnNO;
}
}elseif ([file isKindOfClass:[NSDataclass]]) {
file = [NSDatadataWithContentsOfFile:filename];
if ([file length] ==0) {
returnNO;
}
}
returnYES;
}
+(NSData *) getDataFileFromLoc:(NSString*)filePath into:(id)file {
NSString *Path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *CachePath = [filePath stringByReplacingOccurrencesOfString: @"/"withString: @"_"];
NSString *filename=[Path stringByAppendingPathComponent:CachePath];
if ([file isKindOfClass:[NSDataclass]]) {
file = [NSDatadataWithContentsOfFile:filename];
if ([file length] ==0) {
returnnil;
}
return file;
}
returnnil;
}
方法1,archiveRootObject:toFile,它只能把1个对象写入到同一个文件中。
方法2,通过使用 NSMutableData和NSKeyedArchiver,可以将多个对象写入到同一个文件中。例如
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:testArray1 forKey:@"testArray1"];
[archiver encodeObject:testArray2 forKey:@"testArray2"];
[archiver finishEncoding];
[data writeToFile:path atomically:YES];
一:数据存储方式不同一个是序列化和反序列化后存储文件,另一个就是直接的存储文件了。
二:对象不同,archiveRootObject:toFile:可以将IOS常见的NSData,NSArray等写入文件,也可以将你自己定义的类型(必须实现了序列和凡序列化的,即遵循NSCoding协议,encodeWithCoder和initWithCoder:方法)写入文件,而writeToFile只能将NSDate等IOS常见的数据类型存入文件,因为本身遵循NSCoding协议。
#pragma mark - 下面两个方法可以存储自定义的对象---TMCache就不行。
+(BOOL)saveFileToLoc:(NSString *) fileName theFile:(id) file{
NSString *Path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *CachePath = [fileName stringByReplacingOccurrencesOfString: @"/"withString: @"_"];
NSString *filename=[Path stringByAppendingPathComponent:CachePath];
NSFileManager *fileManager = [NSFileManagerdefaultManager];
if (![fileManager fileExistsAtPath:filename]) {
if (! [fileManager createFileAtPath:filename contents:nilattributes:nil]) {
NSLog(@"createFile error occurred");
}
}
return [file writeToFile:filename atomically:YES];
}
+(BOOL) getFileFromLoc:(NSString*)filePath into:(id)file {
NSString *Path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *CachePath = [filePath stringByReplacingOccurrencesOfString: @"/"withString: @"_"];
NSString *filename=[Path stringByAppendingPathComponent:CachePath];
if ([file isKindOfClass:[NSMutableDictionaryclass]]) {
[file setDictionary: [NSMutableDictionarydictionaryWithContentsOfFile:filename]];
}elseif ([file isKindOfClass:[NSMutableArrayclass]]) {
[file addObjectsFromArray: [NSMutableArrayarrayWithContentsOfFile:filename]];
}elseif ([file isKindOfClass:[NSDataclass]]) {
file = [NSDatadataWithContentsOfFile:filename];
}
if ([file count]==0) {
returnNO;
}
returnYES;
}