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;
        }
    }];
}複製代碼
相關文章
相關標籤/搜索