数据持久化
app开发过程中,或多或少都会存一些数据在程序沙盒路径下,说到这就简单介绍一下应用程序沙盒。
应用程序沙盒:
每个IOS程序有一套自己独立的文件系统,其路径以 / 开始, 这个文件系统成为应用程序沙盒。每个应用程序只能在自己的沙盒内部读写文件,基本不可以去访问外部文件。所有的操作都要进行权限检测。
IOS每个应用程序都有自己的三个目录(Document,Library,tmp),他们只见不能相互访问。
- Document:存放应用程序的数据 (苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录)。
- Library:存储程序的默认设置或其它状态信息。
- tmp:应用程序存储临时文件。
以上路径获取可以定义宏,使用方便:
//沙箱路径
#define kPathTemp NSTemporaryDirectory()
#define kPathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
#define kPathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
程序相关数据保存通常有NSUserDefaults、plist、Core Data、对象归档-NSKeyedArchiver、SQL数据库。
具体详细的操作大家可以百度一下,这就不多介绍了。本文介绍的是用对象归档的方式实现App中业务数据的保存(不包括敏感数据,如用户名、密码这些)。
模块设计
业务数据保存读取这些可以算是一小功能模块,就得模块化。
定义业务数据类型:
typedef NS_ENUM(NSUInteger, PGCacheType)
{
ECacheType_ProductList = 1,//产品列表
ECacheType_UserOrderList,//订单列表
ECacheType_Hots,//更新补丁
ECacheType_Message,//反馈已读消息
ECacheType_ApiStrategy,//接口请求策略缓存的数据
};
设计模块方法:
+ (BOOL)cacheData:(NSObject *)data type:(PGCacheType)type;
+ (BOOL)cacheData:(NSObject *)data type:(PGCacheType)type param:(NSObject *)param;
+ (NSObject *)readCacheType:(PGCacheType)type;
+ (NSObject *)readCacheType:(PGCacheType)type param:(NSObject *)param;
注:上述函数方法中的data需遵循了NSCoding协议。
到此,你会想到app中通过会加入清理缓存的功能,在此很简单,我们也可以添加一方法就可以实现了。
/*
获取缓存数据的大小
*/
+ (float)cacheDataSize;
/*
清理缓存
*/
+ (void)clearCacheData:(void(^)())finishBlock;
具体的源码实现
+ (BOOL)cacheData:(NSObject *)data type:(PGCacheType)type
{
return [PGCacheManager cacheData:data type:type param:nil];
}
+ (BOOL)cacheData:(NSObject *)data type:(PGCacheType)type param:(NSObject *)param
{
NSString *filePath = [PGCacheManager filePathWithType:type param:param];
if(data == nil)
{
return [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
}
else
{
return [NSKeyedArchiver archiveRootObject:data toFile:filePath];
}
}
+ (NSObject *)readCacheType:(PGCacheType)type
{
return [PGCacheManager readCacheType:type param:nil];
}
+ (NSObject *)readCacheType:(PGCacheType)type param:(NSObject *)param
{
NSString *filePath = [PGCacheManager filePathWithType:type param:param];
NSObject *resultObj = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
return resultObj;
}
+ (NSString *)filePathWithType:(PGCacheType)type param:(NSObject *)param
{
NSString *filePath = nil;
switch(type)
{
case ECacheType_ProductList:
{
filePath = [NSString stringWithFormat:@"%@/%@",[PGContext dataPathForCache],[NSString MD5Encrypt:@"productCache"]];
break;
}
case ECacheType_Hots:
{
filePath = [NSString stringWithFormat:@"%@/%@",[PGContext dataPathForCache],[NSString MD5Encrypt:@"systemHots"]];
break;
}
case ECacheType_UserOrderList:
{
filePath = [NSString stringWithFormat:@"%@/%@",[PGContext userPathForCache],[NSString MD5Encrypt:@"OrderListCache"]];
break;
}
case ECacheType_Message:
{
filePath = [NSString stringWithFormat:@"%@/%@",[PGContext userPathDocument],[NSString MD5Encrypt:@"messageReceiptData"]];
break;
}
case ECacheType_ApiStrategy:
{
filePath = [NSString stringWithFormat:@"%@/%@/%@",[PGContext dataPathForCache],[NSString MD5Encrypt:@"apiStrategy"], (NSString *)param];
break;
}
}
return filePath;
}
感谢您的阅读,共同学习进步!!