文本存储自定义对象。

 

 

 /**

     *  缓存model 的方法

     */

    TestModelObject *testModel = [TestModelObjectmodelWithDictionary:dict];

    NSMutableArray * dataArray = [NSMutableArrayarrayWithCapacity:50];

    //testModel类型变为NSData类型

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:testModel];

    //存放数据的数组将data加入进去

    [dataArray addObject:data];

扫描二维码关注公众号,回复: 376180 查看本文章

    //记住要转换成不可变数组类型

    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;

}

猜你喜欢

转载自zhangmingwei.iteye.com/blog/2245263