iOS全局设置

前言

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

不同类型的全局设置

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

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

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

NSUserDefaults

NSUserDefaults用来存储轻量级的本地数据灰常合适,就比如说当前的登录用户数据(用户名,密码等等)。NSUserDefaults存储时支持的数据类型有 NSNumber, NSString, NSDate, NSArray, NSDictionary, BOOL。它有点类似键值对。

plist

plist是Property List的缩写,它是一个xml格式的文件,用来存储串行化后的对象。因此plist文件可以用来存储历史登录用户的数据。

示例

用户登录时

        + (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文件,达到存储历史数据的目的,后面会介绍

用户退出时

+ (void)doLogout {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 获取默认的NSUserDefaults
    [defaults setObject:[NSNumber numberWithBool:NO] forKey:@"loginStatus"]; // 设置登录状态为未登陆
    [defaults synchronize]; // 同步数据
    // do something else, like clear cookies
}

这里将用户登录状态设置为未登陆,并同步数据

判断是否登录

+ (BOOL)isLogin {
    NSNumber *loginStatus = [NSUserDefaults standardUserDefaults] objectForKey:@"loginStatus"]; // 获取用户登录状态
    if (loginStatus.boolValue) { // 判断用户是否登录,并返回
        return YES;
    } else {
        return NO;
    }
}

获取NSUserDefaults中loginStatus键的值来获取用户的登录状态

获取当前登录用户

+ (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。

存储历史数据

+ (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

参考

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器