归档:6-归档多个不同类型的对象
在一个归档文件中,我们可以同时归档多个不同的对象,每个对象可以通过键值来进行区分,归档和解档都需要保持键值的统一,这个与字典的读写有些类似。
归档多个不同类型对象的方法
当我们需要把多个不同类型的对象都归档到一个文件中时,可以通过键值来进行区分,这种存储方式既类似于字典,同时也类似于数据库中根据表名来实现数据的读写。当我们需要归档多个不同类型的对象时,可以采用如下的步骤和方法:
- 设置用于归档的文件路径以及文件名称
- 创建一个NSMutableData对象用于存放需要归档的数据
- 创建一个NSKeyedArchiver类的对象,用来对归档对象进行编码,需要归档的对象都先暂存在NSMutableData对象中
- 使用键值对的方式存储每个需要归档的对象
- 调用finishEncoding方法完成编码
- 把NSMutableData对象写入文件
解档多个不同类型对象的方法
当需要解档存储在文件中的多个不同类型的对象时,可以采用如下步骤:
- 调用NSData的dataWithContentsOfFile:方法,把文件转成NSData对象
- 创建一个NSKeyedUnarchiver对象,用来对需要解档的对象进行解码,解码后就能还原原对象的数据类型
- 根据归档时使用的键值来读取存储的对象
示例代码
在下方的代码中,我们实现了归档多个不同类型的对象,包括基本数据类型(int、float)、Foundation框架中定义的数据类型(NSString)以及自定义类。
- 归档多个不同类型对象
+ (void) writeMultiTypesObjectsToArchiveFile{
//获取文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [docPath stringByAppendingPathComponent:@"multitypesObjects.archive"];
//创建一个MutableData对象用于存放需要归档的数据
NSMutableData *archiveData = [NSMutableData data];
//创建一个NSKeyedArchiver类的对象archiver,用来对归档对象进行编码,编码完成才能进行归档
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiveData];
//归档基本数据类型
[archiver encodeInt:2 forKey:@"int"];
[archiver encodeObject:@"99iOS" forKey:@"string"];
//归档自定义类
Person *person = [[Person alloc] init];
person.name = @"99iOS";
[archiver encodeObject:person forKey:@"person"];
//完成编码
[archiver finishEncoding];
//将archiveData对象写入文件,完成归档
[archiveData writeToFile:filePath atomically:YES];
}
- 解档多个不同类型的对象
+ (void) readSMultiTypesObjectsFromArchiveFile{
//获取文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [docPath stringByAppendingPathComponent:@"multitypesObjects.archive"];
//创建NSData对象来接收解档文件
NSData *unarchiveData = [NSData dataWithContentsOfFile:filePath];
//创建一个NSKeyedUnarchiver对象unarchiver,用来对需要解档的对象进行解码,解码后就能还原原对象的数据类型
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiveData];
//解档对象
int number = [unarchiver decodeIntForKey:@"int"];
NSString *string = [unarchiver decodeObjectForKey:@"string"];
Person *person = [unarchiver decodeObjectForKey:@"person"];
//打印
NSLog(@"number = %d, string = %@, person name = %@", number, string, person.name);
}
https://github.com/99ios/13.4.6
文章发布时间为: December 6th , 2016 at 11:26 am
最后编辑时间为: September 15th , 2017 at 05:36 am
本文由 99ios 创作,转载请注明出处
最后编辑时间为: September 15th , 2017 at 05:36 am
本文由 99ios 创作,转载请注明出处