本文主要是提供MMKV的代码使用教程,若是想知道更多关于MMKV的信息,能够点击如下连接,查看更多信息:html
1. 不建议使用NSUserDefault存储大量数据git
2. MMKV浅析github
3. 认真分析mmap:是什么 为何 怎么用缓存
4. iOS缓存设计bash
5. MMKV在GitHub源码地址app
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[MMKV setLogLevel:MMKVLogNone];//关闭MMKV控制台打印的自带的辅助日志信息
[self kvCreateMethod];//建立MMKV的方法
[self compareMMKVWithNSUesrDefault];//比较MMKV和NSUserDefaults存储数据的效率
[self cLanguageDataType];//存储和读取C语言数据类型
[self ocLanguageDataType];//存储和读取OC语言数据类型
[self kvMigrateFromUserDefaults];//从NSUserDefaults迁移数据到MMKV
// [[MMKV defaultMMKV] clearAll];
//totalSize:文件分配的总磁盘空间4k;actualSize:存储文件占据的实际存储空间298byte
NSLog(@"count:%zu-----totalSize:%zu------actualSize:%zu-----allKeys:%@",[[MMKV defaultMMKV] count],
[[MMKV defaultMMKV] totalSize],[[MMKV defaultMMKV] actualSize],[[MMKV defaultMMKV] allKeys]);
//打印结果:count:7-----totalSize:4096------actualSize:298-----allKeys:(double,uint64,uint32,int32,bool,int64,float)
return YES;
}复制代码
建立MMKV的方法:ide
/*
//如下四种建立方法是彻底等价的,建立的是同一个MMKV实例
*/
- (void)kvCreateMethod
{
//MMKV文件存储的默认为~/Documents/mmkv
NSString *basePath = [MMKV mmkvBasePath];
//修改文件存储的默认路径,在建立MMKV实例以前设置
[MMKV setMMKVBasePath:@""];
//第一种建立方法
MMKV *defaultKV1 = [MMKV defaultMMKV];
//第二种建立方法
MMKV *defaultKV3 = [MMKV mmkvWithID:@"mmkv.default"];
//第三种建立方法
NSString *string = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
string = [string stringByAppendingPathComponent:@"mmkv"];
MMKV *defaultKV4 = [MMKV mmkvWithID:@"mmkv.default" relativePath:string];
//第四种建立方法
MMKV *defaultKV2 = [MMKV mmkvWithID:@"mmkv.default" cryptKey:nil relativePath:string];
}复制代码
比较MMKV和NSUserDefaults存储数据的效率:
ui
/*
写入10万个数据所用的时间
MMKV : 198.487043ms
NSUserDefaults : 13829.244971ms
*/
- (void)compareMMKVWithNSUesrDefault
{
CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
MMKV *customKV = [MMKV mmkvWithID:@"cn.meicai"];
for (int i=0; i<100000; i++) {
[customKV setInt32:i forKey:@"int32"];
}
CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);
NSLog(@"Linked in %f ms", linkTime *1000.0);
NSLog(@"------%d--------",[customKV getInt32ForKey:@"int32"]);
// CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
// NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
// for (int i=0; i<100000; i++) {
// [userDefault setInteger:i forKey:@"int32"];
// }
// CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);
// NSLog(@"Linked in %f ms", linkTime *1000.0);
// NSLog(@"------%ld--------",(long)[userDefault integerForKey:@"int32"]);
}
复制代码
存储和读取C语言数据类型:
加密
/*
//支持如下 C 语语言基础类型:
//bool、int3二、int6四、uint3二、uint6四、float、double
*/
- (void)cLanguageDataType
{
MMKV *mmkv = [MMKV defaultMMKV];
[mmkv setBool:YES forKey:@"bool"];
NSLog(@"bool:%d", [mmkv getBoolForKey:@"bool"]);//打印结果:bool:1
[mmkv setInt32:-1024 forKey:@"int32"];
NSLog(@"int32:%d", [mmkv getInt32ForKey:@"int32"]);//打印结果:int32:-1024
[mmkv setUInt32:std::numeric_limits<uint32_t>::max() forKey:@"uint32"];
NSLog(@"uint32:%u", [mmkv getUInt32ForKey:@"uint32"]);//打印结果:uint32:4294967295
[mmkv setInt64:std::numeric_limits<int64_t>::min() forKey:@"int64"];
NSLog(@"int64:%lld", [mmkv getInt64ForKey:@"int64"]);//打印结果:int64:-9223372036854775808
[mmkv setUInt64:std::numeric_limits<uint64_t>::max() forKey:@"uint64"];
NSLog(@"uint64:%llu", [mmkv getInt64ForKey:@"uint64"]);//打印结果:uint64:18446744073709551615
[mmkv setFloat:-3.1415926 forKey:@"float"];
NSLog(@"float:%f", [mmkv getFloatForKey:@"float"]);//打印结果:float:-3.141593
[mmkv setDouble:std::numeric_limits<double>::max() forKey:@"double"];
NSLog(@"double:%f", [mmkv getDoubleForKey:@"double"]);//打印结果:double:17976931348......24858368.000000
}复制代码
存储和读取OC语言数据类型:
spa
/*
支持如下 ObjC 类型:
NSString、NSData、NSDate
*/
- (void)ocLanguageDataType
{
//cryptKey 根据此秘钥建立AES加密器,加密后的数据存取方法不变,和未加密的同样
MMKV *mmkv = [MMKV mmkvWithID:@"cn.meicai" cryptKey:[@"crypt" dataUsingEncoding:NSUTF8StringEncoding]];
[mmkv setString:@"hello, mmkv" forKey:@"string"];
NSLog(@"string:%@ defaultValue:%@", [mmkv getStringForKey:@"string"],[mmkv getStringForKey:@"string111" defaultValue:@"mmmmmmmmmmmmmmmm"]);
//打印结果:string:hello, mmkv defaultValue:mmmmmmmmmmmmmmmm
[mmkv setObject:nil forKey:@"string"];
NSLog(@"string after set nil:%@, containsKey:%d",
[mmkv getObjectOfClass:NSString.class
forKey:@"string"],
[mmkv containsKey:@"string"]);
//打印结果:string after set nil:(null), containsKey:0
[mmkv setDate:[NSDate date] forKey:@"date"];
NSLog(@"date:%@ defaultValue:%@", [mmkv getDateForKey:@"date"],[mmkv getDateForKey:@"date111" defaultValue:[NSDate date]]);
//打印结果:date:Wed Jun 26 14:39:52 2019 defaultValue:Wed Jun 26 14:39:52 2019
[mmkv setData:[@"hello, mmkv again and again" dataUsingEncoding:NSUTF8StringEncoding] forKey:@"data"];
NSData *data = [mmkv getDataForKey:@"data"];
NSLog(@"data:%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//打印结果:data:hello, mmkv again and again
}复制代码
从NSUserDefaults迁移数据到MMKV:
/*
从NSUserDefault迁移数据到MMKV的实例
*/
- (void)kvMigrateFromUserDefaults
{
[[NSUserDefaults standardUserDefaults] setObject:@"hello world" forKey:@"string"];
[[NSUserDefaults standardUserDefaults] synchronize];
MMKV *userDefaultKV = [MMKV mmkvWithID:@"NSUserDefault"];
[userDefaultKV migrateFromUserDefaults:[NSUserDefaults standardUserDefaults]];
[userDefaultKV enumerateKeys:^(NSString * _Nonnull key, BOOL * _Nonnull stop) {
if ([key isEqualToString:@"string"]) {
NSLog(@"string value is : %@",[userDefaultKV getStringForKey:key]);//打印结果:string value is : hello world
NSLog(@"string value is : %@",[userDefaultKV getObjectOfClass:[NSString class] forKey:key]);//打印结果:string value is : hello world
NSLog(@"string value is : %@",[userDefaultKV getObjectOfClass:[NSNumber class] forKey:key]);//打印结果:string value is : (null)
*stop = YES;
}
}];
}复制代码