iOS iOS Developer

从零开始设计搭建ios App框架(七)

2016-09-24  本文已影响192人  潇水渔翁

数据持久化


app开发过程中,或多或少都会存一些数据在程序沙盒路径下,说到这就简单介绍一下应用程序沙盒。

应用程序沙盒:

每个IOS程序有一套自己独立的文件系统,其路径以 / 开始, 这个文件系统成为应用程序沙盒。每个应用程序只能在自己的沙盒内部读写文件,基本不可以去访问外部文件。所有的操作都要进行权限检测。

IOS每个应用程序都有自己的三个目录(Document,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;
}

感谢您的阅读,共同学习进步!!

上一篇下一篇

猜你喜欢

热点阅读