swift4--NSKeyedArchiver数据文件的归档和解析

首先创建一个基本对象模型

添加一个快捷文件

import Foundation
//创建一个基本对象模型
//创建一个继承自NSObject的类,并遵守NSCoding协议,可以被序列化或者反序列化,这样可以归档到磁盘或者分发到网络上
class UserModel: NSObject,NSCoding{
//    为对象模型添加姓名和密码两个属性
    var name:NSString!
    var password:NSString!
//    添加一个协议方法,用来对模型对象进行序列化操作
    func encode(with aCoder: NSCoder) {
//        对模型的姓名和密码属性进行编码操作,并设置对应的键名
        aCoder.encode(self.name, forKey: "name")
        aCoder.encode(self.password, forKey: "password")
    }
//    添加另一个来自协议的方法,用来对模型对象进行反序列化操作
    required init?(coder aDecoder: NSCoder) {
        super.init()
//        对模型的姓名和属性,根据键名进行解码操作
        self.name = aDecoder.decodeObject(forKey:"name") as! NSString
        self.password = aDecoder.decodeObject(forKey:"password") as! NSString
    }
//    重载父类初始化方法
    override init() {
        
    }
}

然后在Viewcontroller.swift文件中进行归档和恢复归档的操作

//使用归档的方法对模型对象进行持久化工作
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
//        创建一个模型对象,并对其进行归档和恢复归档的操作
//        初始化刚才定义的对象模型
        let user1 = UserModel()
//        设置名称,密码属性的值
        user1.name = "Jerry"
        user1.password = "123"
        
//        创建一个可变二进制数据对象,用来储存归档后的模型对象
        let data = NSMutableData()
//        使数据对象,初始化一个键值归档对象
        let archive = NSKeyedArchiver(forWritingWith: data)
//        对模型对象进行归档操作,(归档操作是指将swift对象,存储为一个文件或者网络上的一个数据块)
        archive.encode(user1, forKey: "user1Key")
//        完成编码,即序列化工作
        archive.finishEncoding()
        
//        初始化一个字符串对象,作为归档文件的存储路径
        let filePath = NSHomeDirectory() + "/Documents/contacts.data"
//        将归档文件存储在程序包的指定位置
        data.write(toFile: filePath, atomically: true)
        
//        对归档文件进行加载和恢复
//        读取刚刚保存的二进制文件
        let fileData = NSMutableData(contentsOfFile: filePath)
//        然后对文件恢复归档,将文件或者来自网络的数据块恢复成swift对象
        let unarchiver = NSKeyedUnarchiver(forReadingWith: fileData! as Data)
//        根据设置的键名对数据进行恢复归档操作,并获得其最终结果
        let saveUser = unarchiver.decodeObject(forKey: "user1Key") as! UserModel
//        完成对象的解码操作
        unarchiver.finishDecoding()
        
        print(saveUser.name)
        print(saveUser.password)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

补充oc的方法:

//读档
-(void)read:(NSString *)path{
    NSString *filePath = path;
//    if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){
    NSString *key = [NSString stringWithFormat:@"last_brt_%d",_grpConf->shortId_];
    
    NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:filePath];
    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    NSMutableDictionary *dic = [unArchiver decodeObjectForKey:key];
    [unArchiver finishDecoding];
    NSLog(@"readSetting key = %@ brt = %@",key,[dic valueForKey:@"brt"]);
    NSString *brtString = [dic valueForKey:@"brt"];
    if (brtString) {
        float brtFloat = [brtString floatValue];
        _colorSelector.slider.value = brtFloat;
       
        CGFloat sliderWidth = kScreen_Width * 0.8 > 300 ? 300 : kScreen_Width * 0.8;
        CGFloat x = _colorSelector.slider.value * (sliderWidth - 20);
        CGFloat v = _colorSelector.slider.value > 0.05 ? _colorSelector.slider.value : 0.05;
        
        _colorSelector.brLabel.text = [NSString stringWithFormat:@"%.f%%", v * 100];
        _colorSelector.brLabel.frame = CGRectMake(x, 0, 36, 16);
    }
    
}

//归档
-(void)save: (CGFloat)brt Path:(NSString *)path {
    if (_grpConf) {
        NSString *key = [NSString stringWithFormat:@"last_brt_%d",_grpConf->shortId_];
        
        NSMutableDictionary * dic = [[NSMutableDictionary alloc] init];
        NSString *str = [NSString stringWithFormat:@"%f", brt];
        [dic setValue:str forKey:@"brt"];
        NSLog(@"saveSetting  key = %@ brt = %@",key,[dic valueForKey:@"brt"]);
        NSMutableData *data = [[NSMutableData alloc] init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        [archiver encodeObject:dic forKey:key];
        [archiver finishEncoding];
        NSString *filePath = path;
        [data writeToFile:filePath atomically:YES];
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值