预备知识
在iOS应用程序中,从“数据缓存在哪里”这个维度看,缓存一般分为两种类型。 ·内存缓存 ·磁盘缓存
内存缓存
是将数据缓存在内存中,供应用程序直接读取和使用。
- 优点是读写速度极快。
- 缺点是由于内存资源有限,应用程序在系统中申请的内存,会随着应用程序生命周期的结束而被释放。这就意味着,如果应用程序在运行的过程中被用户强杀或者出现崩溃情况,都有可能导致内存中缓存的数据丢失,因此,将事件数据缓存在内存中不是最佳选择。
- 磁盘缓存
- 是将数据缓存在磁盘空间中,其特点正好与内存缓存相反。磁盘缓存容量大,但是读写速度相对于内存缓存来说要慢一些。不过磁盘缓存是持久化存储,不受应用程序生命周期的影响。一般情况下,一旦数据成功地保存在磁盘中,丢失的风险就非常低。因此,即使磁盘缓存数据读写速度较慢,但综合考虑下,磁盘缓存是缓存事件数据的最优选择。
本文重点
使用到的第三方框架《BGFMDB》进行数据存储
pod 'BGFMDB', '~> 2.0.13' #2.0.9
#import <BGFMDB/BGFMDB.h>
I 案例1:存储用户ID
例子: 存储显示过广告弹窗的用户ID, 应用场景:首次打开app进行广告弹窗)
1.1 表名的声明
/**
存储是否显示广告弹窗i信息表明:
应用场景:首次打开app进行广告弹窗
*/
NSString * const k_ShowADs_TableName=@"k_ShowADs_TableName";
extern NSString * _Nonnull const k_ShowADs_TableName;
1.2 数据模型的定义
@property (strong, nonatomic) QCTCurrentSysUser *CurrentSysUser;
- QCTCurrentSysUser
/**
用户id
*/
@property (nonatomic,copy) NSString *userInfoId;
1.3 存储和获取
+ (instancetype)getmodelWith_UserInfoId:(NSString*)userInfoId{
// 查询条件
NSString* where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"userInfoId"),bg_sqlValue(userInfoId)];
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:k_ShowADs_TableName where:where] ];
if(tmparr.count>0 ){
QCTCurrentSysUser *userModel = tmparr.firstObject;
NSLog(@"获取的用户 信息%@",userModel.mj_keyValues);
return tmparr.firstObject;
}
return nil;
}
+ (void)saveModelToDBWithModel:(QCTCurrentSysUser*)userModel{
// [self emptySeeionLocal];
// 表名
userModel.bg_tableName = k_ShowADs_TableName;
// 设置一些参数
// userModel.currentHost = currentHost;
//
BOOL isSave = [userModel bg_save];// 保存方法
if (isSave) {
NSLog(@"SysUser保存成功:%@",userModel.mj_keyValues);
//2020-08-04 17:09:06.863509+0800 Housekeeper[1526:203239] DB Error: 1 "no such table: k_ShowADs_TableName"
}else{
NSLog(@"SysUser保存失败:%@",userModel.mj_keyValues);
}
}
1.4 使用数据
- (void)setupisShowCRMShowAdV{
// 获取当前的登陆账号,判断是否弹出过。
if([NSStringQCTtoll isBlankString:UserInfoModel.shareUserInfoModel.CurrentSysUser.userInfoId]){
self.noteViw.hidden = NO;
return ;
}
if(![QCTCurrentSysUser getmodelWith_UserInfoId:UserInfoModel.shareUserInfoModel.CurrentSysUser.userInfoId]){// 为空,表示没显示过
[self.AdV show];
self.noteViw.hidden = YES;
[QCTCurrentSysUser saveModelToDBWithModel:UserInfoModel.shareUserInfoModel.CurrentSysUser];
}else{
self.noteViw.hidden = NO;
}
}
II 案例2: token的存储、获取及清空
2.1 存储用户的会话信息
#pragma mark - ******** iOS 优化登录流程:【打开app,如果 token不过期,就使用最近一次登录的tokenn进行接口请求。】(现状是每次打开app都会重新登录)
+ (void)saveModelWithModel:(UserInfoModel*)userModel{
[self emptySeeionLocal];
userModel.bg_tableName = QCTUserInfoModelTableName;
NSString* currentHost = [NSString stringWithFormat:@"%@%@",[[NSUserDefaults standardUserDefaults]objectForKey:@"KAPPServiceIP"],@""];
userModel.currentHost = currentHost;
NSLog(@" saveModelWithModel currentHost:%@",currentHost);
BOOL isSave = [userModel bg_save];// 保存方法
if (isSave) {
NSLog(@"token保存成功:%@",userModel.mj_keyValues);
}else{
NSLog(@"token保存失败:%@",userModel.mj_keyValues);
}
}
2.2 获取和清除会话信息
+ (instancetype)getmodel4LoginSeesion{
NSString* currentHost = [NSString stringWithFormat:@"%@%@",[[NSUserDefaults standardUserDefaults]objectForKey:@"KAPPServiceIP"],@""];
NSLog(@" getmodel4LoginSeesion currentHost:%@",currentHost);
NSString* where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"currentHost"),bg_sqlValue(currentHost)];
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:QCTUserInfoModelTableName where:where] ];
if(tmparr.count>0 ){
UserInfoModel *userModel = tmparr.firstObject;
// QCTSession.shareQCTSession.userInfo = userModel;
[ QCTSession SaveUserInfo:userModel];
NSLog(@"获取的token 信息%@",userModel.mj_keyValues);
return tmparr.firstObject;
}
NSLog(@"获取的token userModel.shareUserInfoModel %@",UserInfoModel.shareUserInfoModel);
//
return UserInfoModel.shareUserInfoModel;
}
+(void)emptySeeionLocal{
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:QCTUserInfoModelTableName where:nil] ];
// 先删除
for (UserInfoModel *loginModel in tmparr) {
NSString *where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"bg_id"),bg_sqlValue(loginModel.bg_id)];
BOOL isDelete = [UserInfoModel bg_delete:[NSString stringWithFormat:@"%@",QCTUserInfoModelTableName] where:where];
NSLog(@"删除UserInfoModel重复数据%@:%@",isDelete?@"成功":@"失败",loginModel.mj_keyValues);
//
}
}
III 案例3 保存支付方式开关
根据门店保存当前的支付方式开发: 现金和会员支付
- 查询支付方式开关
+ (instancetype)getmodelWithPayWayGroupBaseId:(NSString*)payWayGroupBaseId{
QCTPayWayConfigNoProduct *tmp = [QCTPayWayConfigNoProduct new];
tmp.payWayGroupBaseId = payWayGroupBaseId;
tmp.storeId = [UserInfoModel.shareUserInfoModel store].id;
//NSString * const k_ERPpayWayGroupTableName =@"k_ERPpayWayGroupTableName";
// tmp.tab
tmp.bg_tableName = k_ERPpayWayGroupTableName;
tmp.isOpen = NO;
if([NSStringQCTtoll isBlankString:tmp.payWayGroupBaseId]){
NSLog(@"获取的打印开关信息%@",tmp.payWayGroupBaseId);
return tmp;
}
NSString* where = [NSString stringWithFormat:@"where %@=%@ and %@=%@",bg_sqlKey(@"payWayGroupBaseId"),bg_sqlValue(payWayGroupBaseId),bg_sqlKey(@"storeId"),bg_sqlValue(tmp.storeId)];
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[[self class] bg_find:k_ERPpayWayGroupTableName where:where] ];
if(tmparr.count>0 ){
NSLog(@"firstObject 获取的开关信息%@",[tmparr.firstObject mj_keyValues]);
return tmparr.firstObject;
}
NSLog(@"获取的开关信息%@",tmp.mj_keyValues);
return tmp;
}
- 保存支付方式开关
+ (void)saveModel:(QCTPayWayConfigNoProduct*)model{
model.storeId = [UserInfoModel.shareUserInfoModel store].id;
NSString* where = [NSString stringWithFormat:@"where %@=%@ and %@=%@",bg_sqlKey(@"payWayGroupBaseId"),bg_sqlValue(model.payWayGroupBaseId),bg_sqlKey(@"storeId"),bg_sqlValue(model.storeId)];
NSMutableArray *tmparr = [NSMutableArray arrayWithArray:[ [self class] bg_find:k_ERPpayWayGroupTableName where:where] ];
// 先删除
for (QCTPayWayConfigNoProduct *loginModel in tmparr) {
// if ([loginModel.LoginName isEqualToString:self.viewModel.paramsModel.LoginName]) {
NSString *where = [NSString stringWithFormat:@"where %@=%@",bg_sqlKey(@"bg_id"),bg_sqlValue(loginModel.bg_id)];
BOOL isDelete = [QCTPayWayConfigNoProduct bg_delete:[NSString stringWithFormat:@"%@",k_ERPpayWayGroupTableName] where:where];
NSLog(@"删除重复数据%@:%@",isDelete?@"成功":@"失败",loginModel.mj_keyValues);
// break;
// }
}
// model.mobile = UserInfoModel.shareUserInfoModel.mobile;
model.bg_tableName = k_ERPpayWayGroupTableName;
NSLog(@"k_ERPpayWayGroupTableName bg_save : %@",model.mj_keyValues);
BOOL isSave = [model bg_save];// 保存方法
if (isSave) {
NSLog(@"开关保存成功:%@",model.mj_keyValues);
}else{
NSLog(@"开关保存失败");
}
}
see also
iOS 优化登录流程:【打开app,如果 token不过期,就使用最近一次登录的tokenn进行接口请求。】优化token的存储方式:(之前只是存储在内存,每次打开app都会重新登录,)