歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

iOS數據持久化之歸檔NSKeyedArchiver

IOS數據持久化的方式分為三種:

  1. 屬性列表 (自定義的Property List 、NSUSErDefaults)
  2. 歸檔 (NSKeyedArchiver)
  3. 數據庫 (SQLite、Core Data、第三方類庫等)

  下面主要來介紹一個歸檔NSKeyedArchiver。

   歸檔(又名序列化),把對象轉為字節碼,以文件的形式存儲到磁盤上;程序運行過程中或者當再次重寫打開程序的時候,可以通過解歸檔(反序列化)還原這些對象。

   歸檔方式:

  • 對Foundation框架中對象進行歸檔
  • 對自定義的內容進行歸檔
  • 對自定義的對象進行歸檔

<一> 對Foundation框架中對象進行歸檔

 
//獲得文件路徑
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"];
    
//歸檔(序列化)
NSArray *archiveAry = @[@"jereh",@"ios"];
if ([NSKeyedArchiver archiveRootObject: archiveAry toFile:filePath]) {
        NSLog(@"Archiver  success");
}
    
//解歸檔(反序列化)
NSArray *unArchiveAry = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",unArchiveAry);
 

  小結:

  1. 歸檔和解歸檔操作步驟簡單
  2. 一次只能歸檔一個對象,如果是多個對象歸檔需要分開進行
  3. 歸檔的對象是Foundation框架中的對象
  4. 歸檔和解歸檔其中任意對象都需要歸檔和解歸檔整個文件
  5. 歸檔後的文件是加密的,所以歸檔文件的擴展名可以隨意取

<二> 對自定義的內容進行歸檔

 
//獲得文件路徑
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"];
    
//1. 使用NSData存放歸檔數據
NSMutableData *archiverData = [NSMutableData data];
//2. 創建歸檔對象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
//3. 添加歸檔內容 (設置鍵值對)
 [archiver encodeObject:@"jereh" forKey:@"name"];
 [archiver encodeInt:20 forKey:@"age"];
 [archiver encodeObject:@[@"ios",@"oc"] forKey:@"language"];
//4. 完成歸檔
 [archiver finishEncoding];
//5. 將歸檔的信息存儲到磁盤上
if ([archiverData writeToFile:filePath atomically:YES]) {
     NSLog(@"archiver success");
}
    
//解歸檔
//1. 從磁盤讀取文件,生成NSData實例
NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];
//2. 根據Data實例創建和初始化解歸檔對象
NSKeyedUnarchiver *unachiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
//3. 解歸檔,根據key值訪問
NSString *name = [unachiver decodeObjectForKey:@"name"];
int age = [unachiver decodeIntForKey:@"age"];
NSArray *ary = [unachiver decodeObjectForKey:@"language"];
NSLog(@"name=%@ age=%i ary=%@",name,age,ary);
 

  小結:

  1. 在帶鍵的歸檔中,每個歸檔字段都有一個key值,解歸檔時key值要與歸檔時key值匹配
  2. 帶鍵歸檔可以一次存儲多個對象
  3. 歸檔的對象是Foundation框架中的對象
  4. 歸檔和解歸檔其中任意對象都需要歸檔和解歸檔整個文件
  5. 歸檔後的文件是加密的,所以歸檔文件的擴展名可以隨意取

<三> 對自定義的對象進行歸檔

 
#define IDNUM @"idNum"
#define NAME @"name"

@interface Student : NSObject <NSCoding>
@property (nonatomic, assign) int idNum;
@property (nonatomic, copy) NSString *name;
@end

@implementation Student

#pragma mark 編碼 對對象屬性進行編碼的處理
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeInt:_idNum forKey:IDNUM];
    [aCoder encodeObject:_name forKey:NAME];
}

#pragma mark 解碼 解碼歸檔數據來初始化對象
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        _idNum = [aDecoder decodeIntForKey:IDNUM];
        _name = [aDecoder decodeObjectForKey:NAME];
    }
    return self;
}
@end
 

  小結:

  1. 自定義對象與自定義內容歸檔和解歸檔步驟和用法完全相同
  2. 自定義的對象歸檔需要實現NSCoding協議,並且實現協議中的方法
  3. NSCoding協議中有兩個方法:
    •   encodeWithCoder方法對對象屬性進行編碼,在對象歸檔時調用
    •   initWithCoder方法解碼歸檔數據來初始化對象,在對象解歸檔時調用

 

  總結:

  1. 歸檔和解歸檔可以用於少量數據的持久化存儲和讀取
  2. 屬性列表只能存儲Foundation框架中的對象,歸檔除了可以歸檔Foundation框架中的對象以外,還可以歸檔實現了NSCoding協議的自定義對象
  3. 通過歸檔創建的文件是加密的

Copyright © Linux教程網 All Rights Reserved