本文主要是提供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;
}
}];
}複製代碼