04-IOSCore - User Defaults、Archive、存储总结

一、 User Defaults

        1. 是什么?

            是一个特殊的plist文件

        2. 干什么?

            用于保存应用的配置信息

        3. 存什么信息?

            信息:欢迎界面有没有被打开过           

            目的:欢迎界面只显示一次

           

            信息:应用程序被打开的次数/使用的时间长度/交互的次数

            目的:当应用程序被打开10次后 请求用户对程序打星

           

            信息:数据版本信息

            目的:数据迁移

            1.0

            1|TXT|数据迁移

            2.0

            2212|26782162|TXT|数据迁移|3278232234562734

           

            信息:默认信息

            目的:打开应用程序后 显示默认帐号名

- (void)viewDidLoad

{

    [superviewDidLoad];

    // 判断用户是否是第一次打开

    // 获取用户默认standardUserDefaults

    NSUserDefaults *userDefault = [NSUserDefaultsstandardUserDefaults];

    BOOL opened = [userDefault boolForKey:@"opened"]; // 获取keyopened

   

    [userDefault setBool:YESforKey:@"opened"]; // 设置keyopened

    [userDefault synchronize]; // 同步

}

 

练习:

使用User Defaults

当程序被打开10次时,弹出UIAlertView

提示用户打星

 

 

二、archive归档

plist是对象和plist之间的转换

archive是对象(任何)NSData的渠道

对象到NSData(归档)步骤:

归档(拆毛衣)   

NSObject                    对象         毛衣

NSMutableData     字节         毛线团

NSKeyedArchiver       归档器    拆毛线针

NSCoder                     字节片段  毛线段

 

反归档(织毛衣)

NSData                        字节     毛线团

NSKeyedUnarchiver   反归档器   织毛线针

NSObject                    对象     毛衣

NSCoder                     字节片段   毛线段

注意:对于每一个支持Archive的对象

        1) 必须遵循NSCoding协议

        2) 必须覆盖

            initWithCoder

            encodeWithCoder

知识点:[aCoder encodeObject:self.fatherforKey:@"father"]; // 该属性是对象,程序执行到这里会进入到该对象里进行归档(该对象必须实现归档方法),所以有多个有关联的对象只归档一个就行了

代码如下:

- (void)viewDidLoad

{

    [superviewDidLoad];

    MXPerson *person = [[MXPersonalloc] init];

    person.name = @"张三";

    person.age = 19;

    // 对象 -> NSData    归档

    // 1 创建可变data   构建毛线团

    NSMutableData *data = [NSMutableDatadata];

    // 2 创建archive对象  准备拆线器

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

    // 3 编码     拆线

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

    // 4 完成     收线

    [archiver finishEncoding];

   

    // NSData  ->  对象

    // 获取到data 构建毛线团

   

    // 创建反归档对象   准备织毛线针

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

    // 织毛衣

    MXPerson *p2 = [unarchiver decodeObjectForKey:@"person"];

   

}

 

三、存储总结

1. 解决的核心问题

        在一台设备上保持数据

        内存里的对象 <-> 硬盘上的文件

        能够让内存中的对象延长生命周期

    2. 渠道

1) 基础文件存储

 

内存对象      NSData            文件

       

NSString <-------------------> 文件

从右向左API:  <--

+ stringWithContentsOfFile:encoding:error:

+ stringWithContentsOfFile:usedEncoding:error:

从左向右API:->

writeToFile:atomically:encoding:error:

       

NSString <---> NSData

<-

initWithData:encoding:

->

dataUsingEncoding:

       

UIImage <--------------------> 文件

<-

+ imageNamed:                 Bundle内的

+ imageWithContentsOfFile:     任何

       

UIImage  <----> NSData

<-

- initWithData:

 

NSData <------> 文件

<-

+ dataWithContentsOfFile:

->

- writeToFile:  

 

a) 你是否需要分块读取/写入文件?

    需要:请使用NSFileHandle进行文件读取,替代 NSData <----> 文件

    情形:文件追加

b) 你是否需要存储自定义对象

   

    b.1) 模型层对象少,对象简单,关系不复杂

            自行构建

            对象 <----> NSString

            ->

            拼凑字符串

            <-

            拆分字符串

           

    b.2) 对象结构复杂

            跳转到 2)

       

2) Plist文件存储

        plist支持对象 <-> plist文件

        <-

        + arrayWithContentsOfFile:

        + dictionaryWithContentsOfFile:

       

        ->

        - writeToFile:atomically:

       

        手工处理

        自定义对象 <-> plist支持对象

        <->

        对象         字典

        + 属性     + key-value

       

        a) 该对象需要跨平台么?

            需要:

            放弃plist存储,改为自定义XML格式存储

            自行构建 对象 <-> xml 的渠道

            xml字符串 <-> NSData 。。。继续参考1)

        b) 该数据是否是应用程序相关?

            是应用程序,而不是业务相关

            需要:

            放弃plist存储,改为NSUserDefaults存储

        c) 对象之间的关系是不是很复杂,对象的属性需要不需要可读

            如果关系复杂,不需要可读

            请转接 3)

           

3) Archive 存储

        对象 <-> NSData

        <-

        反归档 decode unarchive

        + initWithCoder

       

        ->

        归档 encode archive

        - encodeWithCoder   

       

        NSData <-> 文件之间的渠道 请参见1)

       

       

        1.2.3.z)

            你希望不希望少写解析代码?

            你希望不希望更高级的查询消息?

            你希望不希望不关心文件的存储位置?

            你希望不希望处理更复杂的对象关系?

           

            如果你都希望

        请转接 4)

       

        4) SQL数据库 & Core Data

           

作业、

    1. TMusic 升级

        1) 欢迎界面只显示一次

        2) 登陆过的人,不需要再登陆

            不支持多帐号

           

单词

    Archive        归档         A. Er1 Kai4 Vu.

    Encode        编码         Yin3 Kou4 De.

    Decode       解码         Di1 Kou4 De.

    Coder               Kou1 De.

 

 

 

posted @ 2014-03-05 18:26  回读(IOS)  阅读(454)  评论(0编辑  收藏  举报