免费开源的iOS开发学习平台

归档: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