项目干货挖掘5——项目中常用的基础功能方法

前言

今天整理一下一般项目中都会有的两个类。它们本身并无难度,主要是对这些细碎的东西梳理一下。都是比较基础的东西,而且代码里的注释比较多,所以主要上代码了。

公共类:PublicFunction

我们可以把项目中一些公用的、基础功能的的东西,且多以类方法的形式定义统一定义在一个公共类里,以便项目开发中调用。


** PublicFunction.h **

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface PublicFunction : NSObject


// app的版本号
+ (NSString *)appVersion;


// 系统版本号
+ (NSString *)OSVersion;


// 设备(iPhone)的固件版本
+ (NSString *)deviceInfo;


// 获取当前的window
+ (UIWindow *)getCurrentWindow;


// 第一次使用APP时保存记号
+ (void)saveAPPFirstUserd:(BOOL)isFirst;


// 判断APP是否是第一次使用
+ (BOOL)isAPPFirstUsered;


// 保存服务器时间和本地时间的差值
+ (void)saveDifferenceWithServerTime:(NSString *)serverTime;


// 获取服务器时间和本地时间的差值
+ (NSTimeInterval)differenceOfLocalAndServer;

// ----- 新添加

// 清除字符串首尾空格
+ (NSString *)clearSpaceOfString:(NSString *)str;

// 清除字符串所有空格
+ (NSString *)clearAllSpaceOfString:(NSString *)str;

@end


** PublicFunction.m **

#import "PublicFunction.h"
#import "sys/utsname.h"


@implementation PublicFunction


// app的版本号
+ (NSString *)appVersion
{
    NSDictionary *dict = [[NSBundle mainBundle] infoDictionary];
    NSString *appVersion = dict[@"CFBundleShortVersionString"];  // 注意区分CFBundleShortVersionString和CFBundleVersion
    
    if(appVersion.length == 0){
        return @"";
    }
    
    return appVersion;
}



// 系统版本号
+ (NSString *)OSVersion
{
    return [[UIDevice currentDevice] systemVersion];
}



// 设备(iPhone)的固件版本
+ (NSString *)deviceInfo
{
    struct utsname systemInfo;
    
    uname(&systemInfo);
    
    NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
    if (platform.length==0){
        return @"";
    }
    return platform;
}



// 获取当前的window
+ (UIWindow *)getCurrentWindow
{
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    if(!window){
        window = [[UIApplication sharedApplication].windows firstObject];
    }
    
    return window;
}



// 第一次使用APP时保存记号
+ (void)saveAPPFirstUserd:(BOOL)isFirst
{
    [[NSUserDefaults standardUserDefaults] setBool:isFirst forKey:@"IsFirstUserAPP"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}



// 判断APP是否是第一次使用
+ (BOOL)isAPPFirstUsered
{
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"IsFirstUserAPP"];
}



// 保存服务器时间和本地时间的差值
+ (void)saveDifferenceWithServerTime:(NSString *)serverTime
{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    dateFormat.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *serverDate = [dateFormat dateFromString:serverTime];
    NSTimeInterval server = [serverDate timeIntervalSince1970];
    
    NSDate *localDate = [NSDate date];
    NSTimeInterval local = [localDate timeIntervalSince1970];
    
    [[NSUserDefaults standardUserDefaults] setInteger:server-local forKey:@"TimeDifferenceOfLocalAndServer"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}



// 获取服务器时间和本地时间的差值
+ (NSTimeInterval)differenceOfLocalAndServer
{
    return [[NSUserDefaults standardUserDefaults] integerForKey:@"TimeDifferenceOfLocalAndServer"];
}



// ----- 新添加

// 清除字符串首尾空格
+ (NSString *)clearSpaceOfString:(NSString *)str
{
    if(str.length == 0){
        return @"";
    }
    
    NSString *string = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    
    return string;
}


// 清除字符串所有空格
+ (NSString *)clearAllSpaceOfString:(NSString *)str
{
    if(str.length == 0){
        return @"";
    }
    NSString *string = [str stringByReplacingOccurrencesOfString:@"" withString:@" "];
    
    return string;
}


@end


用户信息类:UserModel

在项目中我们用一个UserModel类来统一管理有关用户信息等的东西。

** UserModel.h **

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


@interface UserModel : NSObject

@property (nonatomic, copy)NSString     *userId;
@property (nonatomic, copy)NSString     *name;
@property (nonatomic, copy)NSString     *nickName;
@property (nonatomic, copy)NSString     *sex;
@property (nonatomic, copy)NSString     *age;
@property (nonatomic, copy)NSString     *mobile;
@property (nonatomic, copy)NSString     *email;
@property (nonatomic, copy)NSString     *token;
@property (nonatomic, assign)BOOL       isLogin;  // 登录状态,是否登录
@property (nonatomic, copy)NSString     *isSetPayPsd; // 是否设置支付密码


+ (instancetype)shareInstance;

// 保存账号和密码
+ (void)saveAccount:(NSString *)account password:(NSString *)password;

// 保存用户信息到本地
+ (void)saveUserInfoLocal:(NSDictionary *)infoDict;

// 从本地获取用户信息
+ (NSDictionary *)userInfoFromLocal;



// 登录成功后做的一些处理
- (void)handleAfterLoginSuccess:(NSDictionary *)infoDict token:(NSString *)token;

// 退出登录
- (void)handleForLoginOut;

// 弹出登录界面
+ (void)showLoginViewController:(UIViewController *)viewController;

@end

** UserModel.m **

#import "UserModel.h"
#import "LoginViewController.h"


@implementation UserModel


+ (instancetype)shareInstance
{
    static UserModel *userModel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        userModel = [[UserModel alloc] init];
    });
    
    return userModel;
}


- (instancetype)init
{
    self = [super init];
    if(self)
    {
        // 从本地缓存得到用户信息,成为单例UserModel的内存缓存
        [self infoFromDict:[UserModel userInfoFromLocal]];
        _isLogin = [[NSUserDefaults standardUserDefaults] boolForKey:@"LoginState"];
        _token = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserToken"];
    }
    
    return self;
}

// 保存账号和密码
+ (void)saveAccount:(NSString *)account password:(NSString *)password
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    if(userDefaults){
        [userDefaults setObject:account forKey:@"account"];
        [userDefaults setObject:password forKey:@"password"];
        [userDefaults synchronize];
    }
}


// 保存用户信息到本地
+ (void)saveUserInfoLocal:(NSDictionary *)infoDict
{
    if(infoDict.count == 0){
        return;
    }
    
    NSData *infoData = [NSKeyedArchiver archivedDataWithRootObject:infoDict];
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setValue:infoData forKey:@"UserInfoData"];
    [userDefaults synchronize];
}

// 从本地获取用户信息
+ (NSDictionary *)userInfoFromLocal
{
    NSData *infoData = [[NSUserDefaults standardUserDefaults] valueForKey:@"UserInfoData"];
    NSDictionary *infoDict = [NSKeyedUnarchiver unarchiveObjectWithData:infoData];
    
    return infoDict;
}

// 退出登录
- (void)handleForLoginOut
{
    [self changeLoginState:NO];
    _token = nil;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"QuitLogin" object:nil];
}

// 登录成功后做的一些处理
- (void)handleAfterLoginSuccess:(NSDictionary *)infoDict token:(NSString *)token
{
    if(infoDict.count == 0 || token.length == 0){
        return;
    }
    // 登录状态变为YES
    [self changeLoginState:YES];
    
    // 保存token到本地
    [self saveToken:token];
    
    // 保存用户信息
    [self infoFromDict:infoDict];
    [UserModel saveUserInfoLocal:infoDict];
}


// 弹出登录界面
+ (void)showLoginViewController:(UIViewController *)viewController
{
    LoginViewController *loginVC = [LoginViewController new];
    UINavigationController *loginNavC = [[UINavigationController alloc] initWithRootViewController:loginVC];
    [viewController presentViewController:loginNavC animated:YES completion:nil];
}





#pragma mark ---- private method

// 改变登录状态
- (void)changeLoginState:(BOOL)loginState
{
    _isLogin = loginState;
    [[NSUserDefaults standardUserDefaults] setBool:loginState forKey:@"LoginState"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

// 保存token
- (void)saveToken:(NSString *)token
{
    if(token.length == 0){
        return;
    }
    _token = token;
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:token forKey:@"UserToken"];
    [userDefaults synchronize];
}

// 保存用户信息——内存
- (void)infoFromDict:(NSDictionary *)dict
{
    if(dict.count == 0){
        return;
    }
    _userId = [dict valueForKey:@"userId"];
    _name = [dict valueForKey:@"name"];
    _nickName = [dict valueForKey:@"nickName"];
    _sex = [dict valueForKey:@"sex"];
    _age = [dict valueForKey:@"age"];
    _mobile = [dict valueForKey:@"mobile"];
    _email = [dict valueForKey:@"email"];
    _isLogin = [dict valueForKey:@"isLogin"];
    _isSetPayPsd = [dict valueForKey:@"isSetPayPsd"];
}


@end

我们用假数据模拟一下登录成功后的处理:

    // 模拟用户登录请求的网络回调数据
    
    NSDictionary *resultInfo = @{@"userId":@"06",
                                 @"name":@"wang",
                                 @"nickName":@"wang66",
                                 @"sex":@"1",
                                 @"age":@"23",
                                 @"mobile":@"wang",
                                 @"email":@"wang@164.com"};
    NSString *token = @"xxx";

    [[UserModel shareInstance] handleAfterLoginSuccess:resultInfo token:token]; // 登录成功需要的处理
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容