前言
一个iOS项目,有很多东西是全局通用的,比如全局常量等等。在整个项目的某个地方,对其进行全局设置,会极大的方便程序的编写,而且简化程序的结构。
不同类型的全局设置
- 用户登录,用户数据全局存储
用户登录,用户数据全局存储
用户登录时,对用户数据进行存储,在全局都可以获得当前登录用户的数据。来看看如何实现
NSUserDefaults
NSUserDefaults用来存储轻量级的本地数据灰常合适,就比如说当前的登录用户数据(用户名,密码等等)。NSUserDefaults存储时支持的数据类型有 NSNumber, NSString, NSDate, NSArray, NSDictionary, BOOL。它有点类似键值对。
plist
plist是Property List
的缩写,它是一个xml格式的文件,用来存储串行化后的对象。因此plist文件可以用来存储历史登录用户的数据。
示例
用户登录时
1 2 3 4 5 6 7
| + (void)doLogin:(NSDictionary *)loginData { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 获取默认的NSUserDefaults [defaults setObject:[NSNumber numberWithBool:YES] forKey:@"loginStatus"]; // 设置登录状态为已登录 [defaults setObject:loginData forKey:@"loginData"]; // 存储当前登录用户数据。注:loginData为NSDictionary,里面可以存放username、password、email等信息 [defaults synchronize]; // 同步数据 [self saveLoginData:loginData]; // 使用plist存储历史登录用户数据,在后文会有介绍 }
|
这里使用NSUserDefaults存储登录时的数据:
- 使用loginStatus键来存储登录状态:YES表示已登录,NO表示未登陆
- 使用loginData键来存储登录用户的数据:该键对应的值是一个NSDictionary,该字典里面可以包含username、password、email等与当前用户相关的数据
- [defaults synchronize]; 该方法表示将NSUserDefaults数据同步到磁盘,此举避免了程序意外退出而导致数据未存储的情况
- saveLoginData方法将这个用户数据写入plist文件,达到存储历史数据的目的,后面会介绍
用户退出时
1 2 3 4 5 6
| + (void)doLogout { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 获取默认的NSUserDefaults [defaults setObject:[NSNumber numberWithBool:NO] forKey:@"loginStatus"]; // 设置登录状态为未登陆 [defaults synchronize]; // 同步数据 // do something else, like clear cookies }
|
这里将用户登录状态设置为未登陆,并同步数据
判断是否登录
1 2 3 4 5 6 7 8
| + (BOOL)isLogin { NSNumber *loginStatus = [NSUserDefaults standardUserDefaults] objectForKey:@"loginStatus"]; // 获取用户登录状态 if (loginStatus.boolValue) { // 判断用户是否登录,并返回 return YES; } else { return NO; } }
|
获取NSUserDefaults中loginStatus键的值来获取用户的登录状态
获取当前登录用户
1 2 3 4 5
| + (User *)curLoginUser { NSDictionary *loginData = [NSUserDefaults standardUserDefaults] objectForKey:@"loginData"]; // 获取当前用户数据 User *curLoginUser = loginData ? [NSObject objectOfClass:@"User" fromJSON:loginData]; // 转化为User对象 return curLoginUser; }
|
获取NSUserDefaults中loginData的NSDictionary,并转化为User对象返回。注:User对象为一个model。
存储历史数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| + (NSString *)loginDataListPath { NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; // 返回app存放数据的Documents文件夹路径 NSString *listPath = [documentPath stringByAppendingPathComponent:@"login_list.plist"]; // 返回存放历史数据的plist文件的路径,他在Documents文件夹里面 return listPath; }
+ (NSMutableDictionary *)readLoginDataList { NSMutableDictionary *loginDataList = [NSMutableDictionary dictionaryWithContentsOfFile:[self loginDataListPath]]; // 读取plist文件内容,并将它存放在NSMutableDictionary中返回 return loginDataList; }
+ (BOOL)saveLoginData:(NSDictionary *)loginData { BOOL save = NO; if (loginData) { NSMutableDictionary *loginDataList = [self readLoginDataList]; // 获取已经存储的用户数据 User *curUser = [NSObject objectOfClass:@"User" fromJSON:loginData]; // 转化为User对象 if (curUser.username.length > 0) { [loginDataList setObject:loginData forKey:curUser.username]; // 更新历史数据中该用户的数据 save = YES; } if (save) { save = [loginDataList writeToFile:[self loginDataListPath] atomically:YES]; // 将数据写入plist文件 } } }
|
以上代码中包括三个函数:
- loginDataListPath: 该函数返回plist文件的路径
- readLoginDataList: 该函数读取plist文件中的数据,以NSDictionary的方式返回
- saveLoginData: 更新readLoginDataList中返回的历史数据,加入当前登录用户的数据;并再次将已经更新的历史用户数据写入plist文件
p.s
以上代码均参照Coding-iOS
参考