NSUserDefaults 存储自定义对象方法

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

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

// 类名:



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

.h文件

#import 

#define UserDefaultsSave(obj, key) [[NSUserDefaults standardUserDefaults] setObject:obj forKey:key]
#define UserDefaultsGet(key) [[NSUserDefaults standardUserDefaults] objectForKey:key]
// 此类依赖 #import 
@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  *shopImages;

// 需设置 依赖MJExtension.h
+ (NSDictionary *)mj_objectClassInArray {
    return @{@"shopImages" : [Resource_Relation class]};
}

你可能感兴趣的:(NSUserDefaults 存储自定义对象方法)