MMKV使用教程

本文主要是提供MMKV的代码使用教程,若是想知道更多关于MMKV的信息,能够点击如下连接,查看更多信息:html

1. 不建议使用NSUserDefault存储大量数据git

2. MMKV浅析github

3. 认真分析mmap:是什么 为何 怎么用缓存

4. iOS缓存设计bash

5. MMKV在GitHub源码地址app

MMKV实际使用的代码案例以下:

- (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;
        }
    }];
}复制代码