iOS单例和NSUserDefaults混合使用

前言:

  • 在我们iOS项目中存储一些用户配置信息或者一些其他公共信息我们首先回想到用单例来做,但是单例是在app结束生命之后单例的所有属性就会消失,有得时候又不是很适合我们的需求,比如我们要记录一个登录状态或者是用户配置信息这些信息是一直存在也必须存在的,这时候我们的单例就心有余而力不足了,于是我就研究了一套单例和NSUserDefaults配合使用的案例。

实现原理:

  • 首先我们实现一个单例类和一个属性Models用来存储一些属性,存储的同时我们把这个单例属性Models以NSData类型来存储到NSUserDefaults中,之后尽管app杀死单例属性消失我们的NSUserDefaults中也会把这个单例Models存储下来以便下次启动app的时候读取到单例Models中在使用。

单例的实现:

  • MRC的实现我就不讲了我就直接讲下ARC单例类实现,上代码。
新建一个单例类文件(UserInfoContext)继承NSObject
UserInfoContext.h文件代码实现:
新建一个单例Models
//导入单例Modesl头文件
#import "UserInfo.h"
@property(nonatomic,strong) UserInfo *userInfo;
+(UserInfoContext*)sharedUserInfoContext;
UserInfoContext.m文件代码实现:
@synthesize userInfo;
static UserInfoContext *sharedUserInfoContext = nil;
+(UserInfoContext*)sharedUserInfoContext{
static dispatch_once_t token;
dispatch_once(&token, ^{
    if(sharedUserInfoContext == nil){
        sharedUserInfoContext = [[self alloc] init];
    }
});
return sharedUserInfoContext;
}
+(id)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t token;
     dispatch_once(&token, ^{
         if(sharedUserInfoContext == nil){
             sharedUserInfoContext = [super allocWithZone:zone]; 
         }
     });
         return sharedUserInfoContext;
}
- (instancetype)init{
 self = [super init];
 if(self){
    //实例化这个Models
     sharedUserInfoContext.userInfo = [[UserInfo alloc] init];
 }
 return self;
}
- (id)copy{
     return self;
}
- (id)mutableCopy{
     return self;
}
新建一个单例Models(UserInfo)存放属性继承NSObject
UserInfo.h文件代码实现:
@interface UserInfo : NSObject<NSCoding>{
    BOOL isLogin;//判断是否登录
    NSString *phoneNumber;//手机号
    NSString *cookie;//cookie
    NSInteger tabBarSelected;//tabbar
    NSString *deviceid;//设备号
}
@property (nonatomic,assign) BOOL isLogin;
@property (nonatomic,copy) NSString *phoneNumber;
@property (nonatomic,copy) NSString *cookie;
@property (nonatomic,assign) NSInteger tabBarSelected;
@property (nonatomic,copy) NSString *deviceid;
UserInfo.m文件代码实现(属性编码解码):
@synthesize isLogin;
@synthesize phoneNumber;
@synthesize cookie;
@synthesize tabBarSelected;
@synthesize deviceid;
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeBool:self.isLogin forKey:@"isLogin"];
    [aCoder encodeObject:self.phoneNumber     forKey:@"phoneNumber"];
    [aCoder encodeObject:self.cookie forKey:@"cookie"];
    [aCoder encodeInteger:self.tabBarSelected forKey:@"tabBarSelected"];
    [aCoder encodeObject:self.deviceid forKey:@"deviceid"];  
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self =[super init]) {
        self.isLogin = [aDecoder decodeBoolForKey:@"isLogin"];
        self.phoneNumber = [aDecoder     decodeObjectForKey:@"phoneNumber"];
        self.cookie = [aDecoder decodeObjectForKey:@"cookie"];
        self.tabBarSelected = [aDecoder     decodeIntegerForKey:@"tabBarSelected"];
        self.deviceid = [aDecoder decodeObjectForKey:@"deviceid"];
    }
    return self;
}
@end
新建一个工具类(Utilities)存放属性继承NSObject

为了更好的简便的使用这个这个单例和NSUserDefaults的读取和存储

Utilities.h文件代码实现:
//单例-> NSUserDefaults
+(void)SetNSUserDefaults:(UserInfo *)userInfo;
//NSUserDefaults-> 单例
+(UserInfo *)GetNSUserDefaults;
Utilities.m文件代码实现:
//存储单例Models(UserInfo)到NSUserDefaults
+(void)SetNSUserDefaults:(UserInfo *)userInfo{
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:userInfo];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:data forKey:@"user"];
    [defaults synchronize];  
}
//读取NSUserDefaults存储内容return到单例Modesl(UserInfo)中
+(UserInfo *)GetNSUserDefaults{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:@"user"];
    return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

以上代码我们屡屡

1.开始我们实现了一个单例类(UserInfoContext);
2.在单例类中实现了一个属性Models(UserInfo);
3.实现了一个工具类方便把单例属性Models(UserInfo)存储到NSUserDefaults以及把NSUserDefaults内容读取到单例属性Models(UserInfo)中。

  • 下面我们来试验调用赋值给单例Models(UserInfo)同时把单例Models(UserInfo)存储到NSUserDefaults中

//存储在单例中
 UserInfo *user = [UserInfoContext sharedUserInfoContext].userInfo;
 user.isLogin = YES;
 user.phoneNumber = @"13552539636"
 user.cookie = @"QQ396368888";
 //启动app默认选中TabBar
 user.tabBarSelected = 0;
//在把单例存储到NSUserDefaults(调用工具类方法)
[Utilities SetNSUserDefaults:user];
  • 在AppDelegate类中得didFinishLaunchingWithOptions方法中直接读取NSUserDefaults内容到单例使用

//读取用户状态和配置信息到单例中
[UserInfoContext sharedUserInfoContext].userInfo= [Utilities GetNSUserDefaults];
  • 以上我们完整的一套流程就做好了,我为什么要做这个呢,是因为我们产品提出了一个奇葩的要求就是要启动默认显示哪个TabBar和一些用户设置像App主题皮肤等等一系列要求,所以单例就不够用了。
  • 代码就不上GitHub了这上面代码没有少一句照搬都可以。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容