数据存储封装—支持内存和本地缓存
2016-04-10 19:00
459 查看
公司这几天底层进行重构,本地需要缓存一些数据,对比目前一些比较火的三方,最终决定选用Objective-LevelDB。Objective-LevelDB,是一个基于Google's LevelDB的Objective-C数据库。然后对其进行了简单封装,支持内存和本地缓存,废话少说,直接用法。
支持pod, pod ‘Objective-LevelDB’
源码git地址https://github.com/matehat/Objective-LevelDB
下面是.h封装
#import <Foundation/Foundation.h> /** * 存储服务 基于Objective-LevelDB */ @interface FlyStorageManage : NSObject /* * 存储对象到内存 * * @parm object 对象 * @parm akey key */ + (void)setObjectToMemory:(id)object forKey:(NSString *)akey; /** * 内存中读取某个对象 * * @parm akey key * * @return */ + (id)objectFromMemoryForkey:(NSString *)akey; /** * 从内存中移除某个对象 * * @parm akey key */ + (void)removeObjectFromMemoryForKey:(NSString *)akey; /** * 存储对象到本地缓存 * * @parm object 对象 对象需要实现NSCoding序列化 * 也可配合MJExtension/JsonModel转换成字典存储 * @parm akey key */ + (void)setObjectToLocalCache:(id)object forKey:(NSString *)akey; /** * 从本地缓存中读取某个对象 * * @parm akey key * * @return */ + (id)objectFromLocalCacheForkey:(NSString *)akey; /** * 从本地缓存中移除某个对象 * * @parm akey key */ + (void)removeObjectFromLocalCacheForKey:(NSString *)akey; @end
然后是.m的实现
#import "FlyStorageManage.h" #import "Objective-LevelDB/Classes/LevelDB.h" @interface FlyStorageManage () @property (nonatomic, strong) NSMutableDictionary *memoryServiceDict; @property (nonatomic, strong) LevelDB *levelDB; @end static NSString *const kLevelDBName = @"level.db"; @implementation FlyStorageManage + (FlyStorageManage *)shareInstance { static dispatch_once_t onceToken; static FlyStorageManage *service = nil; dispatch_once(&onceToken, ^{ service = [[FlyStorageManage alloc] init]; }); return service; } - (instancetype)init { if (self = [super init]) { self.memoryServiceDict = [[NSMutableDictionary alloc] init]; self.levelDB = [LevelDB databaseInLibraryWithName:kLevelDBName]; self.levelDB.encoder = ^NSData * (LevelDBKey * key, id object) { __block id result = nil; result = [NSKeyedArchiver archivedDataWithRootObject:object]; return result; }; self.levelDB.decoder = ^id (LevelDBKey * key, id data) { __block id result = nil; result = [NSKeyedUnarchiver unarchiveObjectWithData:data]; return result; }; } return self; } #pragma mark --- MemoryService + (void)setObjectToMemory:(id)object forKey:(NSString *)akey { // 线程安全 @synchronized (self) { if (object && akey) { [[self shareInstance].memoryServiceDict setObject:object forKey:akey]; } } } + (id)objectFromMemoryForkey:(NSString *)akey { @synchronized (self) { return [[self shareInstance].memoryServiceDict objectForKey:akey]; } } + (void)removeObjectFromMemoryForKey:(NSString *)akey { @synchronized (self) { [[self shareInstance].memoryServiceDict removeObjectForKey:akey]; } } #pragma mark --- LocalCacheService + (void)setObjectToLocalCache:(id)object forKey:(NSString *)akey { [[FlyStorageManage shareInstance].levelDB setObject:object forKey:akey]; } + (id)objectFromLocalCacheForkey:(NSString *)akey { return [[FlyStorageManage shareInstance].levelDB objectForKey:akey]; } + (void)removeObjectFromLocalCacheForKey:(NSString *)akey { [[FlyStorageManage shareInstance].levelDB removeObjectForKey:akey]; } @end
下面是调用部分 (嫌序列化太麻烦,所以调用了MJ大大的MJExtension转换成字典进行存储)
- (void)viewDidLoad { [super viewDidLoad]; Person *person = [[Person alloc] init]; person.name = @"测试下"; person.age = @"18"; person.height = 14; person.textArr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",nil]; NSString *personKey = @"testKey"; NSDictionary *perDic = person.mj_keyValues; [FlyStorageManage setObjectToLocalCache:perDic forKey:personKey]; NSDictionary *dic = [CBStorageService objectFromLocalCacheForKey:personKey]; }
是不是很方便简单,有需要的朋友可以直接拿去用了
相关文章推荐
- 基于zookeeper+leveldb搭建activemq集群
- [转]Leveldb实现原理
- leveled学习
- LevelDB的实现原理
- leveldb中的编码方式的分析
- caffe RGB转gay存储为Leveldb 格式(CIFAR10)示例
- IOS 四种保存数据的方式
- 编译、测试 leveldb
- iOS创建、删除文件夹、获取沙盒路径
- Leveldb官方文档(中文版)
- Leveldb源码分析--1
- Leveldb源码分析--2
- Leveldb源码分析--3
- Leveldb源码分析--4
- Leveldb源码分析--5
- Leveldb源码分析--6
- Leveldb源码分析--7
- Leveldb源码分析--8
- Leveldb源码分析--9
- Leveldb源码分析--10