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]};
}