iOS

项目必备的用户单例

Posted by 阿唯不知道 on December 30, 2017

只要是涉及到用户登录的项目,单例是必不可少的,你的单例设计的合理吗?

传说中的单例

以下是我的用户单例:YSUserModel

1、先看 YSUserModel.h 文件

/**
 * 用户模型(单例)
 */

#import <Foundation/Foundation.h>

@interface YSUserModel : NSObject

/** 用户token令牌 */
@property (nonatomic, copy) NSString      *token;

/** 用户id */
@property (nonatomic, copy) NSString      *id;

/** 用户名 */
@property (nonatomic, copy) NSString      *username;

/** 登录密码 */
@property (nonatomic, copy) NSString      *password;

/** 用户头像 */
@property (nonatomic, copy) NSString      *avatar;

/** 手机号码 */
@property (nonatomic, copy) NSString      *phone;

/** 用户角色(如教师、家长) */
@property (nonatomic, assign) NSInteger      userType;

/** 是否已登录 */
@property (nonatomic, assign) BOOL     isLogin;


/**
 * 单例初始化
 */
+ (YSUserModel *)shareInstance;

/**
 * 重置单例
 */
+ (void)resetUuserModel;

/**
 * 清除本地的所有用户数据
 */
+ (void)clearLocalUserModel;


/**
 更新本地的用户数据
 @param user 传入用户模型
 */
+ (void)updateLocalUserModel:(YSUserModel *)user;

/**
 * 加载本地的用户模型
 */
+ (YSUserModel *)loadLocalUserModel;

@end

2、再看 YSUserModel.m 文件

#import "YSUserModel.h"

// 引入YYModel(字典、数组等与模型互转)
//#import "NSObject+YYModel.h"

#pragma mark - ==================数据本地化===========================
#define kUserDefaults       [NSUserDefaults standardUserDefaults]
//立即同步到文件
#define kSynchronize        [[NSUserDefaults standardUserDefaults] synchronize];

static dispatch_once_t  onceToken;
static YSUserModel    *userModel = nil;
static NSString *keyName = @"YSUserModel";


@implementation YSUserModel

// 单例初始化
+ (YSUserModel *)shareInstance
{
    
    dispatch_once(&onceToken, ^{
        userModel = [[super allocWithZone:NULL] init] ;
    });
    return userModel;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    return [YSUserModel shareInstance];
}

- (id)copyWithZone:(struct _NSZone *)zone
{
    return [YSUserModel shareInstance] ;
}

// 重置单例
+ (void)resetUuserModel
{
    onceToken = 0;
    userModel = nil;
}

// 清除本地的所有用户数据
+ (void)clearLocalUserModel {
    // 把登录状态置为NO
    // 重置用户单例
    [YSUserModel resetUuserModel];
    // 清空用户本地化缓存的数据
    [kUserDefaults removeObjectForKey:keyName];
    [kUserDefaults synchronize];
}


#pragma mark - * * * * * 下面两个方法需要需要引入 YYModel 方能使用 * * * * *

//// 更新本地的用户数据
//+ (void)updateLocalUserModel:(YSUserModel *)user
//{
//    // 将用户模型转换成json数据
//    NSData *data = [user modelToJSONData];
//    // 将用户数据存储到本地
//    [kUserDefaults setObject:data forKey:keyName];
//    // 立即同步到文件
//    kSynchronize;
//}
//
//// 加载本地的用户模型
//+ (YSUserModel *)loadLocalUserModel {
//    NSData *data = [kUserDefaults objectForKey:keyName];
//    if (!data) {
//        return nil;
//    }
//    return [YSUserModel modelWithJSON:data];
//}

@end