前言

一个iOS项目,有很多东西是全局通用的,比如全局常量等等。在整个项目的某个地方,对其进行全局设置,会极大的方便程序的编写,而且简化程序的结构。

不同类型的全局设置

  1. 用户登录,用户数据全局存储

用户登录,用户数据全局存储

用户登录时,对用户数据进行存储,在全局都可以获得当前登录用户的数据。来看看如何实现

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存储登录时的数据:

  1. 使用loginStatus键来存储登录状态:YES表示已登录,NO表示未登陆
  2. 使用loginData键来存储登录用户的数据:该键对应的值是一个NSDictionary,该字典里面可以包含username、password、email等与当前用户相关的数据
  3. [defaults synchronize]; 该方法表示将NSUserDefaults数据同步到磁盘,此举避免了程序意外退出而导致数据未存储的情况
  4. 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文件
}
}
}

以上代码中包括三个函数:

  1. loginDataListPath: 该函数返回plist文件的路径
  2. readLoginDataList: 该函数读取plist文件中的数据,以NSDictionary的方式返回
  3. saveLoginData: 更新readLoginDataList中返回的历史数据,加入当前登录用户的数据;并再次将已经更新的历史用户数据写入plist文件

p.s

以上代码均参照Coding-iOS

参考