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

归档:4-归档多个自定义对象

在实际的开发过程中,我们通常会把多个自定义对象放在一个数组中进行操作,这其中也包括对存储自定义对象的数组进行归档/解档操作。

实现思路

当我们需要归档多个自定义对象时,通常采取如下的思路。

  • 定义自定义类,遵守NSCoding协议,并实现NSCoding协议中定义的归档、解档方法;
  • 在需要使用自定义对象的地方,创建一个数组,用于存储自定义对象;
  • 在工具类中,对存储自定义对象的数组实现归档以及解档操作

示例代码

我们通过一个示例实现归档/解档多个自定义对象。在该案例中,我们可以把多个自定义对象写入一个数组中,并对该数组进行归档、解档操作。

  • 创建一个Person类,添加属性,遵守NSCoding协议,并实现NSCoding协议中定义的方法,具体实现方法参见上一章节;

  • 在ArchiveService工具类中,添加如下两个方法,实现对数组的归档与解档操作

@interface ArchiveService : NSObject

+ (BOOL) writeObjectsToArchiveFile:(NSArray *) array;
+ (NSMutableArray *) readObjectsFromArchiveFile;

@end
  • 实现writeObjectsToArchiveFile:方法。在该方法中调用NSKeyedArchiver的类方法archiveRootObject:toFile:将数组对象归档。
+ (BOOL) writeObjectsToArchiveFile:(NSArray *) array{
    //获取文件路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *filePath = [docPath stringByAppendingPathComponent:@"persons.archive"];
    
    //归档
    return  [NSKeyedArchiver archiveRootObject:array toFile:filePath];
}
  • 实现readObjectsFromArchiveFile方法,在该方法中,调用NSKeyedUnarchiver的类方法unarchiveObjectWithFile:实现从文件中解档数组
+ (NSMutableArray *) readObjectsFromArchiveFile{
    //获取文件路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *filePath = [docPath stringByAppendingPathComponent:@"persons.archive"];
    //解档
    NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    return array;
}
  • 在控制器类中,添加一个数组属性用于存储自定义对象,并实现其初始化方法,在初始化方法中,使用解档操作来获取存储在本地文件中的对象数据
@interface ViewController ()
@property (nonatomic,strong) NSMutableArray *personsArray;
@end
-(NSMutableArray *)personsArray{
    if (_personsArray == nil) {
        //从归档文件中创建,如果文件不存在,则初始化一个空的数组      
        _personsArray = [ArchiveService readObjectsFromArchiveFile];      
        if (_personsArray == nil) {
            _personsArray = [NSMutableArray array];
        }
    }
    return _personsArray;
}
  • 搭建界面

  • 实现【写入归档文件】按钮的操作,可以反复写入多个对象到本地文件
- (IBAction)writeToFile:(id)sender {
    NSDictionary *dict = @{@"name":self.nameTextField.text,
                           @"age":self.ageTextField.text};
    Person *person = [Person personWithDict:dict];
    [self.personsArray addObject:person];
    if([ArchiveService writeObjectsToArchiveFile:self.personsArray]){
        NSLog(@"归档成功");
    };
}

  • 实现【读取归档文件】按钮功能,可以读取出存储的多个对象
- (IBAction)readFromFile:(id)sender {
    NSMutableArray *persons = [ArchiveService readObjectsFromArchiveFile];
    for (Person *person in persons) {
        NSLog(@"person name: %@, person age:%@", person.name,person.age);
    }
}

https://github.com/99ios/13.4.4