閑扯
剛下地鐵的時候阿根廷和美國開場3分鐘,拉維奇在梅西的挑傳下進球。剛剛梅西任意球世界波。中場休息的時候準備寫一篇博客。
封裝的緣由
每一個項目登錄的時候都要獲取一些信息,之前我們的項目把這些信息保存在了plist文件里。我覺得這個是很麻煩的。面對這些東西,我一直都想用一句話解決,無論是plist還是NSKeyedUnarchiver。所以比較閑的時候封裝了這個類。
功能
其實功能和單獨使用NSKeyedUnarchiver沒有太大的差別,可能很多人都會選擇自己去寫,而不是去封裝出來。畢竟代碼量并不是很多。我想唯一的一個比較稍微好一點的功能就是能夠保存你寫的Model類。
代碼
保存一個model類
Model *model = [[Model alloc] init]; model.name = @"zhangsan"; model.age = 100; model.weight = 100.99; model.value = @10; model.mutableArray = [[NSMutableArray alloc] initWithObjects:@"zhangsan", @"lisi", @"wangwu", nil]; model.dict = @{ @"name": @"zhaolasdasdsadiu" }; [ArchiveData saveValue:model WithKey:@"model"];
取出這個model
Model *archiveModel = [ArchiveData takeModelValueWithKey:@"model" WithClass:@"Model"]; NSLog(@"%@,%d,%f,%@,%@,%@", archiveModel.name, archiveModel.age, archiveModel.weight, archiveModel.value, archiveModel.mutableArray, archiveModel.dict);
保存一個字典
NSDictionary *dict = @{ @"zhangsan": @"lisi" }; [ArchiveData saveValue:dict WithKey:@"dict"];
取出一個字典
NSDictionary *archiveDict = [ArchiveData takeValueWithKey:@"dict"]; NSLog(@"archiveDict=%@", archiveDict);
保存一個NSNumber類型
NSNumber *number = @100; [ArchiveData saveValue:number WithKey:@"number"];
取出一個NSNumber類型
NSNumber *archiveNumber = [ArchiveData takeValueWithKey:@"number"]; NSLog(@"archiveNumber=%@", archiveNumber);
源代碼分析
保存Model類
當你保存一個model對象的時候,代碼首先使用runtime得到了model類的所有屬性和屬性值。將這些鍵值對放入了一個字典當中。然后對這個字典進行保存。所以保存下來的不是一個model對象,而是一個字典。
保存過以后你就可以取出這個model,你傳遞的參數有兩個一個是保存時候的key,另外一個是Model的Name。代碼接收到Model的Name 的時候使用runtime得到了這個類。然后使用key取出我們保存的字典,使用YYmodel把字典賦值給了model。
這是保存Model類的大致流程。
其它的數據類型
保存這些數據類型,你需要看一下NSKeyedUnarchiver的api。代碼在這里做的只是將拿到的數據保存到了一個指定的目錄下。
意義
可能很多人都會覺得封裝出來這個類并沒有什么太大的意義。但是怎么說,至少在一定程度上你使用這個類,可以減少你的代碼量和邏輯的判斷。很多時候你只需要保存,取出使用就可以了。
對于用戶信息的保存,你可以在appdelegate里取出數據賦值給model,在其它地方直接使用或者更改信息的內容。
地址
點擊進入github查看源碼
你也可以使用pod 'ArchiveData', '~> 0.0.1'在項目里使用這個類。