項目干貨挖掘5——項目中常用的基礎功能方法

前言

今天整理一下一般項目中都會有的兩個類。它們本身并無難度,主要是對這些細碎的東西梳理一下。都是比較基礎的東西,而且代碼里的注釋比較多,所以主要上代碼了。

公共類:PublicFunction

我們可以把項目中一些公用的、基礎功能的的東西,且多以類方法的形式定義統(tǒng)一定義在一個公共類里,以便項目開發(fā)中調用。


** PublicFunction.h **

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

@interface PublicFunction : NSObject


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


// 系統(tǒng)版本號
+ (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"];  // 注意區(qū)分CFBundleShortVersionString和CFBundleVersion
    
    if(appVersion.length == 0){
        return @"";
    }
    
    return appVersion;
}



// 系統(tǒng)版本號
+ (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類來統(tǒng)一管理有關用戶信息等的東西。

** 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;  // 登錄狀態(tài),是否登錄
@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;
    }
    // 登錄狀態(tài)變?yōu)閅ES
    [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

// 改變登錄狀態(tài)
- (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

我們用假數(shù)據(jù)模擬一下登錄成功后的處理:

    // 模擬用戶登錄請求的網絡回調數(shù)據(jù)
    
    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]; // 登錄成功需要的處理
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容