zoukankan      html  css  js  c++  java
  • iOS学习之NSKeyedArchiver、NSKeyedUnarchiver归档

    IOS保存文件的其中一种形式是NSKeyedArchiver、NSKeyedUnarchiver归档:

    以下内容以一个to-do lists软件为例,ChecklistItem为一个项目(数据模型),包含一个字符串text和一个BOOL标记checked,items是视图控制器的NSMutableArray,包含多个ChecklistItem,保存数据时以items为整体保存到.plist文件,读取则一样。

    1.首先在数据模型的.h文件中实现协议<NSCoding>,例如:

    @interface ChecklistItem : NSObject <NSCoding>

    2.添加encode和decode方法(NSCoder归档和解档时会调用)

    -(void)encodeWithCoder:(NSCoder *)aCoder

    {

        [aCoder encodeObject:self.text forKey:@"Text"];

        [aCoder encodeBool:self.checked forKey:@"Checked"];

    }

     -(id)initWithCoder:(NSCoder *)aDecoder

    {

        if((self = [super init]))

        {

            self.text = [aDecoder decodeObjectForKey:@"Text"];

            self.checked = [aDecoder decodeBoolForKey:@"Checked"];

        }

        return self;

    }

    以下两步建议新建一个用于集中操控数据模型的.m和.h文件,如DataModel.m和DataModel.h,然后添加以下方法

    3.获取app沙盒Document路径和保存的文件名

    -(NSString *)documentsDirectory

    {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *documentsDirectory = [paths firstObject];

        return documentsDirectory;

    }

    -(NSString *)dataFilePath

    {

        return [[self documentsDirectory] stringByAppendingPathComponent:@"Checklists.plist"];

    }

    4.实现保存和读取.plist文件的方法

    -(void)saveChecklistItems

    {

        NSMutableData *data = [[NSMutableData alloc]init];

        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

        [archiver encodeObject:_items forKey:@"ChecklistItems"];

        [archiver finishEncoding];

        [data writeToFile:[self dataFilePath] atomically:YES];

    }

    -(void)loadChecklistItems

    {

        NSString *path = [self dataFilePath];

        if([[NSFileManager defaultManager] fileExistsAtPath:path])

        {

            NSData *data = [[NSData alloc] initWithContentsOfFile:path];

            NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

            _items = [unarchiver decodeObjectForKey:@"ChecklistItems"];

            [unarchiver finishDecoding];

        }

        else

        {

            _items = [[NSMutableArray alloc]initWithCapacity:20];

        }

    }

    5.当DataModel类对象实例化时,读取.plist文件(如果存在的话)

    -(id)init

    {

        if((self = [super init]))

        {

            [self loadChecklists];

        }

        return self;

    }

    6.在需要保存数据的操作方法中(添加、删除、修改一个项目)调用保存数据方法

    [_dataModel saveChecklistItems];  //_dataModel是在其他视图控制器通过DataModel类创建的对象

  • 相关阅读:
    字符数组+数组复习
    C语言博客作业05-指针
    C语言博客作业04 数组
    C语言博客作业03 函数
    Java与C# socket通信
    JDBC复制数据库(sqlite)
    mysql Connector/net不能更新或删除(转载)
    MATLAB回归、插值、逼近、拟合【转载】
    前端请求RestController发送数据方法汇总
    elementUI el-input 输入框 设置高度和宽度
  • 原文地址:https://www.cnblogs.com/guitarandcode/p/5449604.html
Copyright © 2011-2022 走看看