IOS有幾種存儲數據在本地的方式,比方屬性表plist、coredata的數據庫存儲等等,這裡解說歸檔這種存儲方式。
歸檔是一種翻譯的名字,原名叫 Archiver ,可以了解成將數據以序列化的方式存儲在本地,像是將文件放在文件夾中一樣,停止材料的歸檔寄存。其實相關的類名為 NSKeyedArchiver ,keyed 在這裡應該是對歸檔的數據賦上了鍵的意思,就想給文件存檔時要依照有文件名。
與之絕對的有一個類叫 NSKeyedUnarchiver ,望文生義就是反歸檔了,也可以叫解檔,可以將之前歸檔的數據恢復成原始數據。
其實我所了解的這個進程很像緊縮與解壓,在存儲多對象時我們待會也會看到的確有一個 encode 和 decode 的進程,辦法名就是這個,所以為了便於了解也可以想象成將數據緊縮成一個緊縮包後存儲在本地,要恢單數據時再解壓就可以了。
本文舉兩個歸檔的例子,一個是復雜的對單個對象停止歸檔,另一個是對多個對象一致歸檔到一同。
歸檔單個對象先直接上代碼:
NSString *homeDirectory = NSHomeDirectory();// 根目錄
NSString *demoPath = [homeDirectory stringByAppendingPathComponent:@"demo.archiver"];// 添加存儲的文件名
BOOL flag = [NSKeyedArchiver archiveRootObject:@"Cloudox" toFile:demoPath];// 歸檔一個字符串
if (flag) NSLog(@"歸檔成功");
NSLog(@"解檔後為:%@", [NSKeyedUnarchiver unarchiveObjectWithFile:demoPath]);
要歸檔數據停止存儲,當然要有存儲的地位,所以首先獲取設備的目錄並且樹立一個要存儲歸檔數據的目錄,留意後綴名要是 .archiver 。
隨後的 archiveRootObject: toFile: 辦法就是將一個對象歸檔並存儲到文件地位了,很復雜明了,這個辦法會前往一個布爾值,表示能否歸檔存儲成功了。
解檔運用的是 unarchiveObjectWithFile: 辦法,從數據的存儲途徑獲取歸檔文件停止解檔,就失掉了我們存儲的原始數據了。
運轉後的後果如圖:
歸檔多個對象還是先上代碼然後對著看:
NSString *name = @"Cloudox";
NSInteger age = 24;
//途徑
NSString *multiPath = [homeDirectory stringByAppendingPathComponent:@"multi.archiver"];
//存儲多個對象的容器
NSMutableData *multiData = [[NSMutableData alloc] init];
NSKeyedArchiver *multiArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:multiData];
[multiArchiver encodeObject:name forKey:@"name"];
[multiArchiver encodeInteger:age forKey:@"age"];
[multiArchiver finishEncoding];// 完畢對多個對象的歸檔
[multiData writeToFile:multiPath atomically:YES];
// 解檔
//存儲解檔後多個對象的容器
NSMutableData *unMultiData = [[NSMutableData alloc] initWithContentsOfFile:multiPath];
NSKeyedUnarchiver *multiUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unMultiData];
NSString *unName = [multiUnarchiver decodeObjectForKey:@"name"];
NSInteger unAge = [multiUnarchiver decodeIntegerForKey:@"age"];
[multiUnarchiver finishDecoding];// 完畢對多個對象的解檔
NSLog(@"多對象解檔後為:%@的年齡為%ld", unName, unAge);
要歸檔多個對象,除了存儲途徑外,我們還要有一個 NSMutableData 對象來作為容器寄存多個對象,也就是說我們實踐歸檔的是這個 NSMutableData 對象。代碼中運用了 encodeObject: forKey: 和 encodeInteger: forKey: 辦法來辨別緊縮對象數據和整型數據,這裡不同類型的數據是有不同辦法的,當然不同的數據是要賦給不同的鍵的,之後要依據鍵來獲取目的數據,全部要固定的對象都緊縮後就可以 finishEncoding 了。
解檔時也需求一個 NSMutableData 來作為解檔後的數據容器,然後對其中的數據停止解碼,這裡就用到了歸檔時所賦的鍵,解碼完畢後異樣要 finishDecoding ,便失掉了需求的數據。
運轉效果如下:
以上就是歸檔的復雜運用辦法,在閱讀知名第三方庫源碼時也常常看到了歸檔的運用,所以學習一下還是有必要的。
示例工程:https://github.com/Cloudox/ArchiverDemo
版權一切:http://blog.csdn.net/cloudox_
【iOS存儲方式之歸檔】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!