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]};
}
网友评论