NSUserDefaults 存儲自定義對象方法

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]};
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容