zoukankan      html  css  js  c++  java
  • NSKeyedArchiver/NSKeyedUnarchiver归档应用(缓存实现)

    • NSKeyedUnarchiver : 从二进制流读取对象; NSKeyedArchiver :把对象写到二进制流中去。

    • 要实现对数据模型的归档,需要我们实现NScoding协议,(NScoping)(copy协议是为了模型数据可以复制,对于归档而言,不是必须要实现):

      • NScoder 和 NScoding:NScoding 是一个协议,而NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法
      • NScoding协议需要实现两个方法:
        -(void)encodeWithCoder:(NSCoder *)aCoder       
        // 以keyValue形式对基本数据类型Encoding,从coder中读取数据,保存到相应的变量中,即反序列化数据
        -(id)initWithCoder:(NSCoder *)aDecoder		   
        // 以keyValue形式对基本数据类型Decoding,读取实例变量,并把这些数据写到coder中去。序列化数据,返回数据模型本身
        
        
    • KeyedArchiver能够保存这些类型的对象:NSArray, NSDictionary, NSDate, NSNumber, NSString, and NSData,是因为这些对象本身遵循了NSCoding.

    NSCoding协议/NSKeyedArchiver结合将模型归档

    Student.h

    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject<NSCoding>
    /** name */
    @property (nonatomic, retain) NSString *name;
    /** ID */
    @property (nonatomic, retain) NSString *ID;
    
    - (Student *)initWithName: (NSString *)newName andID: (NSString *)newID;
    
    @end
    

    Student.m

    #import "Student.h"
    
    @implementation Student
    
    - (Student *)initWithName:(NSString *)newName andID:(NSString *)newID {
        self = [super init];
        if (self) {
            self.name = newName;
            self.ID = newID;
        }
        return self;
    }
    
    - (void)encodeWithCoder:(NSCoder *)aCoder {
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeObject:self.ID forKey:@"ID"];
    }
    
    // 分别把两个属性变量根据关键字进行逆转码,最后返回一个Student类的对象
    - (instancetype)initWithCoder:(NSCoder *)aDecoder {
        if (self = [super init]) {
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.ID = [aDecoder decodeObjectForKey:@"ID"];
        }
        return self;
    }
    
    @end
    
    

    调用:

     	Student *stu1 = [[Student alloc]initWithName:@"124" andID:@"111"];//学生对象stu1
        Student *stu2 = [[Student alloc]initWithName:@"223" andID:@"222"];//学生对象stu2
        NSArray *stuArray =[NSArray arrayWithObjects:stu1,stu2, nil];//学生对象数组,里面包含stu1和stu2
        
        NSData *stuData = [NSKeyedArchiver archivedDataWithRootObject:stuArray];//归档
        NSArray *stuArray2 =[NSKeyedUnarchiver unarchiveObjectWithData:stuData];//逆归档
    

    NSUserDefault/NSKeyedArchiver结合实现本地缓存

    • NSUserDefault(偏好设置)
      • NSUserDefaults是一个单例,在整个程序中只有一个实例对象,而且不同于我们自己定义的单例,因为他不会随着这个程序的关闭而清除掉保存的数据,下次你开启程序,你之前保存的数据还是存在的,所以他可以用于本地数据的持久化,而且简单实用,我们也可以用来做为页面间的传值。
      • NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
      • NSUserDefaults保存的数据是不可变的,即使存入的是可变数组(字典),取出来的也是不可变的。
      • model的存储。
      • NSUserDefault需要注意点参考一下这个博客运用NSUserDefaults保存数据实现数据缓存
    • NSUserDefault/NSKeyedArchiver结合实现本地缓存:
      这是这几天项目里的缓存代码
      • HomeFrameHelper.h
    #import <Foundation/Foundation.h>
    
    @interface HomeFrameHelper : NSObject
    + (instancetype)sharedInstance;
    /** frameArray */
    @property (nonatomic, strong) NSMutableArray *homeFrameArray;
    
    - (NSMutableArray *)getHomeFrameModelFromLocal;
    - (void)saveHomeFrameModelToLocal;
    - (void)clear;
    
    @end
    
    - HomeFrameHelper.m
    
    #import "HomeFrameHelper.h"
    
    static HomeFrameHelper *sharedInstance = nil;
    
    @implementation HomeFrameHelper
    
    + (instancetype)sharedInstance{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedInstance = [[self alloc] init];
        });
        return sharedInstance;
    }
    
    - (instancetype)init {
        self = [super init];
        if (self) {
            
        }
        return self;
    }
    
    - (NSMutableArray *)getHomeFrameModelFromLocal {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        
        id obj = [defaults objectForKey:HOME_FRAME_DEFAULT_ARRAY];
        if (obj) {
            return [NSKeyedUnarchiver unarchiveObjectWithData:obj];
        }else {
            return nil;
        }
    }
    
    - (void)saveHomeFrameModelToLocal {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.homeFrameArray];
        [defaults removeObjectForKey:HOME_FRAME_DEFAULT_ARRAY];
        [defaults setObject:data forKey:HOME_FRAME_DEFAULT_ARRAY];
        [defaults synchronize];  // 同步
    }
    
    - (void)clear {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults removeObjectForKey:HOME_FRAME_DEFAULT_ARRAY];
        [defaults synchronize];
    
        self.homeFrameArray = nil;
    }
    
    - (void)setHomeFrameArray:(NSMutableArray *)homeFrameArray {
        _homeFrameArray = homeFrameArray;
    }
    
    @end
    
    
    - 调用:
    
        [HomeFrameHelper sharedInstance].homeFrameArray = dic2
        [[HomeFrameHelper sharedInstance] saveHomeFrameModelToLocal];
    
  • 相关阅读:
    c++编程和c在思想上最大的差别
    java反射field和method的顺序问题
    使用wireshark分析tcp/ip报文之报文头
    wireshark不支持抓localhost/127.0.0.1的包解决方法
    wireshark捕获表达式之Berkeley Packet Filter (BPF) syntax
    java replaceAll之$替换
    阿里云至今不支持组播,确实比较坑爹
    java安全体系之JCA、JCE、JAAS、JSSE及其关系
    一个风控计算负载过高到mysql主从拆分暴露的各种设计复杂性问题以及解决方法总结
    作为从业人员,如果一定要学一门新的编程语言,那么它一定是c++
  • 原文地址:https://www.cnblogs.com/wust-zxl/p/6475818.html
Copyright © 2011-2022 走看看