歸檔

一、歸檔的基本概念

之前將數(shù)據(jù)保存本地此熬,只能是字符串庭呜、數(shù)組、字典犀忱、NSNuber募谎、BOOL等容器類對(duì)象對(duì)象,不能將所有對(duì)象都給保存阴汇,而采用歸檔能將所有的對(duì)象轉(zhuǎn)化為二進(jìn)制數(shù)據(jù)保存在文件中数冬,并通過(guò)解歸檔讓將文件里面保存的數(shù)據(jù)讀取出來(lái)

二、使用環(huán)境

之前我們給通訊錄添加一個(gè)聯(lián)系人只能是將添加的人放到一個(gè)字典中搀庶,然后將這個(gè)字典放到數(shù)組中拐纱,最終將數(shù)組寫入文件中

當(dāng)我們需要顯示這些聯(lián)系人時(shí)铜异,要從文件中將這個(gè)數(shù)組讀取出來(lái),還要將數(shù)據(jù)里面的一個(gè)個(gè)字典轉(zhuǎn)化成model,放到一個(gè)新數(shù)組里

而現(xiàn)在我們可以使用歸檔在添加的時(shí)候就將這一個(gè)個(gè)聯(lián)系人的信息轉(zhuǎn)化成model秸架,將這些model直接放到一個(gè)數(shù)組里揍庄,需要展示的時(shí)候,在從文件中讀取出來(lái)數(shù)據(jù)东抹,此時(shí)這個(gè)數(shù)組里面存放直接就是一個(gè)個(gè)model

有些應(yīng)用支持一個(gè)離線緩存蚂子,也就是說(shuō)當(dāng)手機(jī)沒(méi)聯(lián)網(wǎng)時(shí),可以將手機(jī)有網(wǎng)時(shí)的數(shù)據(jù)存放在本地缭黔,當(dāng)手機(jī)沒(méi)網(wǎng)時(shí)食茎,從本地中取出來(lái)這些數(shù)據(jù)展示

三、某個(gè)對(duì)象支持歸檔解歸檔需要滿足三個(gè)條件

1试浙、所屬的類遵守NSCoding協(xié)議

2董瞻、實(shí)現(xiàn)協(xié)議里面的歸檔方法

  - (void)encodeWithCoder:(NSCoder *)aCoder

3、實(shí)現(xiàn)協(xié)議里面的解歸檔方法

  - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder

四田巴、對(duì)系統(tǒng)的類進(jìn)行歸檔解歸檔

1钠糊、指定將對(duì)象放在哪個(gè)文件中,歸檔后的文件壹哺,后綴要求是archiver

   [NSHomeDirectory() stringByAppendingPathComponent:@"data.archiver"];

2抄伍、將對(duì)象歸檔到指定的路徑中

   [NSKeyedArchiver archiveRootObject:name toFile:path];

3、將歸檔后的數(shù)據(jù)提取出來(lái)

   [NSKeyedUnarchiver unarchiveObjectWithFile:path];

五管宵、對(duì)自定義的類進(jìn)行歸檔與解歸檔

1截珍、讓這個(gè)類遵循<NSCoding>

2、實(shí)現(xiàn)歸檔方法,aCoder就是歸檔時(shí)傳過(guò)來(lái)的歸檔對(duì)象箩朴,對(duì)象被歸檔時(shí)會(huì)調(diào)用這個(gè)方法

  - (void)encodeWithCoder:(NSCoder *)aCoder{

     [aCoder encodeObject:self.name forKey:@"name"];

     [aCoder encodeInteger:self.age forKey:@"age"];

     [aCoder encodeObject:self.sex forKey:@"sex"];
  }


3岗喉、實(shí)現(xiàn)解歸檔方法,對(duì)象解歸檔是會(huì)調(diào)用這個(gè)方法

  - (instancetype)initWithCoder:(NSCoder *)aDecoder{

   //解歸檔時(shí)會(huì)產(chǎn)生一個(gè)Person對(duì)象炸庞,這里是給這個(gè)Person對(duì)象賦值
   self = [super init];
  
   if (self) {
    
     self.name = [aDecoder decodeObjectForKey:@"name"];

     self.age = [aDecoder decodeIntegerForKey:@"age"];

     self.sex = [aDecoder decodeObjectForKey:@"sex"];
   }

     return self;
 }

六钱床、同時(shí)將多個(gè)對(duì)象歸檔與解歸檔

1、歸檔

  1)準(zhǔn)備一個(gè)可變的data對(duì)象埠居,通過(guò)歸檔對(duì)象將多個(gè)數(shù)據(jù)存在一個(gè)data對(duì)象里查牌,最終將這個(gè)data寫入文件

    NSMutableData *data = [NSMutableData data];

  2)archiver初始化的時(shí)候包裝一個(gè)可變的data對(duì)象

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

  3)通過(guò)歸檔對(duì)象將這些數(shù)據(jù)轉(zhuǎn)化成二進(jìn)制,并保存在一個(gè)data對(duì)象里

    [archiver encodeObject:name forKey:@"name"];

    [archiver encodeInteger:age forKey:@"age"];

    [archiver encodeObject:sex forKey:@"sex"];

  4)轉(zhuǎn)化完畢滥壕,意思是結(jié)束使用歸檔對(duì)象將上面的數(shù)據(jù)保存在了data里面

    [archiver finishEncoding];

  5)將轉(zhuǎn)化好的data寫入文件

    [data writeToFile:path atomically:YES];

2纸颜、解歸檔

  1)將路徑里的二進(jìn)制數(shù)據(jù)給取出來(lái)
    
    NSMutableData *data = [NSMutableData dataWithContentsOfFile:path];

  2)將二進(jìn)制數(shù)據(jù)包裝在一個(gè)解歸檔對(duì)象中

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

  3)通過(guò)解歸檔對(duì)象將二進(jìn)制數(shù)據(jù)分別給反序列化

    NSString *name = [unarchiver decodeObjectForKey:@"name"];

    NSInteger age = [unarchiver decodeIntegerForKey:@"age"];

    NSString *sex = [unarchiver decodeObjectForKey:@"sex"];

七、練習(xí)

1绎橘、模擬網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行本地緩存

1)修改新工程自帶的ViewController.h 如下

   #import <UIKit/UIKit.h>

   @interface ViewController : UITableViewController

   @end

2)在AppDelegate.m里面自定義window,

   self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
   [self.window makeKeyAndVisible];
   //報(bào)錯(cuò)后胁孙,記得導(dǎo)入ViewController  #import "ViewController.h"
   self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc]init]];

3)新建一個(gè)InfoModel類,

   InfoModel.h

    #import <Foundation/Foundation.h>

    //對(duì)象要?dú)w檔必須要遵守NSCoding協(xié)議
    @interface InfoModel : NSObject<NSCoding>

    @property(nonatomic,copy) NSString *name;
    @property(nonatomic,copy) NSString *phone;

    @end

   InfoModel.m

   #import "InfoModel.h"

   @implementation InfoModel

   - (void)encodeWithCoder:(NSCoder *)aCoder{

    [aCoder encodeObject:self.name forKey:@"name"];

    [aCoder encodeObject:self.phone forKey:@"phone"];
   }


   - (instancetype)initWithCoder:(NSCoder *)aDecoder{

    self = [super init];

    if (self) {
    
      self.name = [aDecoder decodeObjectForKey:@"name"];
    
      self.phone = [aDecoder decodeObjectForKey:@"phone"];
    }

    return self;

   }
   
   @end

4) ViewController.m

   #import "ViewController.h"

   #import "InfoModel.h"

   //報(bào)錯(cuò),將課件中的MJExtension文件夾拖到工程中
   #import "MJExtension.h"

   //模擬服務(wù)器路徑
   #define kLocalPath [NSHomeDirectory() stringByAppendingPathComponent:@"data.archiver"]

   //模擬本地緩存路徑
   #define kServerPath [[NSBundle mainBundle] pathForResource:@"Connect" ofType:@"plist"]


   @interface ViewController ()
   {
     NSMutableArray *dataArray;
   }
   @end

   @implementation ViewController

   - (void)viewDidLoad {
      [super viewDidLoad];

      [self loadData];
   }

   - (void)loadData{

       //準(zhǔn)備數(shù)據(jù)
       dataArray = [self fetchData];


       if(dataArray == nil){
    
         NSLog(@"請(qǐng)檢查網(wǎng)絡(luò)設(shè)置");
    
         return;
       }

       [self.tableView reloadData];

   }

   - (NSMutableArray *)fetchData{

       //1浊洞、先從服務(wù)器獲取數(shù)據(jù)
       NSMutableArray *tempArray = [NSMutableArray arrayWithContentsOfFile:kServerPath];

       if (tempArray == nil) {
    
         //2冕茅、如果從服務(wù)器獲取數(shù)據(jù)失敗,則從本地緩存中讀取數(shù)據(jù)
         tempArray = [NSKeyedUnarchiver unarchiveObjectWithFile:kLocalPath];

       }else{
   
        //3调违、如果從服務(wù)器獲取數(shù)據(jù)成功漓穿,則將數(shù)據(jù)通過(guò)MJExtension框架坷衍,轉(zhuǎn)化為model
        tempArray = [InfoModel mj_objectArrayWithKeyValuesArray:tempArray];
    
        //4、將最新從服務(wù)器獲取到數(shù)據(jù)保存到本地
        [NSKeyedArchiver archiveRootObject:tempArray toFile:kLocalPath];
   
       }

       return tempArray;

    }


   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

      return dataArray.count;
    }

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

      static NSString *cellID = @"cellID";

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

      if (cell == nil) {
    
      cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellID];
      
      }


      InfoModel *model = dataArray[indexPath.row];

      cell.textLabel.text = model.name;

      cell.detailTextLabel.text = model.phone;

      return cell;

    }

   @end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苫亦,一起剝皮案震驚了整個(gè)濱河市毛肋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屋剑,老刑警劉巖润匙,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唉匾,居然都是意外死亡孕讳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門巍膘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厂财,“玉大人,你說(shuō)我怎么就攤上這事峡懈×Пィ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵肪康,是天一觀的道長(zhǎng)荚恶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)磷支,這世上最難降的妖魔是什么谒撼? 我笑而不...
    開(kāi)封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮雾狈,結(jié)果婚禮上嗤栓,老公的妹妹穿的比我還像新娘。我一直安慰自己箍邮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布叨叙。 她就那樣靜靜地躺著锭弊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擂错。 梳的紋絲不亂的頭發(fā)上味滞,一...
    開(kāi)封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼剑鞍。 笑死昨凡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚁署。 我是一名探鬼主播便脊,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼光戈!你這毒婦竟也來(lái)了哪痰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤久妆,失蹤者是張志新(化名)和其女友劉穎晌杰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體筷弦,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肋演,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烂琴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爹殊。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖监右,靈堂內(nèi)的尸體忽然破棺而出边灭,到底是詐尸還是另有隱情,我是刑警寧澤健盒,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布绒瘦,位于F島的核電站,受9級(jí)特大地震影響扣癣,放射性物質(zhì)發(fā)生泄漏惰帽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一父虑、第九天 我趴在偏房一處隱蔽的房頂上張望该酗。 院中可真熱鬧,春花似錦士嚎、人聲如沸呜魄。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爵嗅。三九已至,卻和暖如春笨蚁,著一層夾襖步出監(jiān)牢的瞬間睹晒,已是汗流浹背趟庄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伪很,地道東北人戚啥。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锉试,于是被迫代替她去往敵國(guó)和親猫十。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一键痛、歸檔的基本概念 之前將數(shù)據(jù)保存本地炫彩,只能是字符串、數(shù)組絮短、字典江兢、NSNuber、BOOL等容器類對(duì)象對(duì)象丁频,不能將...
    空白Null閱讀 5,215評(píng)論 1 10
  • 一杉允、歸檔介紹 1.歸檔是指用某種格式來(lái)保存一個(gè)或多個(gè)對(duì)象,以便以后還原這些對(duì)象的過(guò)程席里。歸檔是將數(shù)據(jù)持久化的一種方式...
    lilinjianshu閱讀 846評(píng)論 0 0
  • 歸檔 歸檔->數(shù)據(jù)持久化的方式->加密(把文件加密《不是把數(shù)據(jù)加密》 歸檔分為: 1叔磷、存儲(chǔ)數(shù)據(jù)(編碼、序列化奖磁、歸檔...
    磊CC閱讀 2,131評(píng)論 2 3
  • 一改基、歸檔的基本概念 之前將數(shù)據(jù)保存本地,只能是字符串咖为、數(shù)組秕狰、字典、NSNuber躁染、BOOL等容器類對(duì)象對(duì)象鸣哀,不能將...
    Luyize閱讀 626評(píng)論 0 0
  • 關(guān)鍵詞: 歸檔:數(shù)據(jù)持久化的一種方式,是將數(shù)據(jù)進(jìn)行編碼序列化之后存儲(chǔ)的過(guò)程吞彤。適用于小量數(shù)據(jù)的存儲(chǔ)我衬。 解檔:對(duì)歸檔的...
    追沐閱讀 1,477評(píng)論 0 1