NSUserDefaultsカスタムオブジェクトメソッドの格納

2875 ワード

NSUserDefaultsが軽量レベルのデータをローカルでサポートするのに適したデータフォーマットは、NSNumber(Integer、Float、Double)、NSString、NSDate、NSArray、NSDictionary、BOOLタイプです.これらのデータに加えて、ユーザーがログインした後の個人情報や、ローカルにキャッシュする履歴検索記録オブジェクトなど、ローカルにカスタムオブジェクトを格納する必要がある場合が多く、データベースに格納するには多くのものを関連付ける必要がある可能性があり、やや面倒な場合など、このカスタムオブジェクトをNSUserDefaultsでアクセスするのは便利です.
NSObjectを1つのCategoryで拡張するだけで、任意のオブジェクトを格納できます.
//  :




以下はヘッダファイルと対応するインプリメンテーションファイルです.このメソッドを実装するには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]};
}