美文网首页iOS开发开发中涉及到的方方面面
NSUserDefaults 存储自定义对象方法

NSUserDefaults 存储自定义对象方法

作者: rztime | 来源:发表于2017-07-16 23:55 被阅读238次

    NSUserDefaults适合存储轻量级数据到本地
    支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型。
    除了这些数据,很多时候需要存储一些自定义对象到本地,比如用户登录之后的个人信息,一些需要缓存到本地的历史搜索记录对象等等,存储到数据库有可能又需要关联很多东西,稍显麻烦等等,那么将此自定义对象用NSUserDefaults存取无疑是非常方便的。

    简单用一个Category来扩展NSObject,即可存储任意对象

    // 类名:
    <NSObject+UserDefaults.h>
    <NSObject+UserDefaults.m>
    
    

    下面是头文件和对应的实现文件
    要实现此方法依赖MJExtension库 :主要是方便将字典转换成模型

    .h文件

    #import <Foundation/Foundation.h>
    
    #define UserDefaultsSave(obj, key) [[NSUserDefaults standardUserDefaults] setObject:obj forKey:key]
    #define UserDefaultsGet(key) [[NSUserDefaults standardUserDefaults] objectForKey:key]
    // 此类依赖 #import <MJExtension.h>
    @interface NSObject (UserDefaults)
    
    
    /**
     将对象 保存到 NSUserDeafluts中
    
     @param key key值
     */
    - (void)saveToUserDefaultsForKey:(NSString *)key;
    
    
    /**
     将NSUserDefaults中的Key对应的对象解析出来
    
     @param key key值
     @return 对象  NSObject
     */
    +(id)userDefaultsForKey:(NSString *)key;
    
    @end
    
    
    

    .m文件

    #import "NSObject+UserDefaults.h"
    
    @implementation NSObject (UserDefaults)
    
    /**
     将对象 保存到 NSUserDeafluts中
    
     @param key key值
     */
    - (void)saveToUserDefaultsForKey:(NSString *)key {
        NSDictionary *dict = [self mj_keyValues];
        NSData *data = [dict toDataForKey:key];
        if (data) {
            UserDefaultsSave(data, key);
        }
    }
    
    /**
     将NSUserDefaults中的Key对应的对象解析出来
    
     @param key key值
     @return 对象  NSDictionary
     */
    + (id)userDefaultsForKey:(NSString *)key {
        NSData *data = UserDefaultsGet(key);
        NSDictionary *dict = [data toDictForKey:key];
        if (!dict) {
            return nil;
        }
        return [self mj_objectWithKeyValues:dict];
    }
    
    - (NSData *)toDataForKey:(NSString *)key {
        NSMutableData * data = [[NSMutableData alloc] init];
        NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        [archiver encodeObject:self forKey:key];
        [archiver finishEncoding];
        return data;
    }
    
    - (NSDictionary *)toDictForKey:(NSString *)key {
        NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)self];
        NSDictionary * myDictionary = [unarchiver decodeObjectForKey:key];
        [unarchiver finishDecoding];
        return myDictionary;
    }
    
    @end
    

    使用方法

    // 保存数据到NSUserDefaults
    UDUser *user = [[UDUser alloc]init];
    // user数据
    ...
    [user saveToUserDefaultsForKey:@"UDUser"];  
    
    
    // 取数据
    UDUser *user =  [UDUser userDefaultsForKey:@"UDUser"];
    

    如果对象中包含有数组对象属性,那么需要在对象中设置

    // 如:
    // 门店形象
    @property (nonatomic, strong)NSArray<Resource_Relation *>  *shopImages;
    
    // 需设置 依赖MJExtension.h
    + (NSDictionary *)mj_objectClassInArray {
        return @{@"shopImages" : [Resource_Relation class]};
    }
    

    相关文章

      网友评论

        本文标题:NSUserDefaults 存储自定义对象方法

        本文链接:https://www.haomeiwen.com/subject/wrlctxtx.html