首页 > 其他 > 详细

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

时间:2014-03-05 21:00:24      阅读:598      评论:0      收藏:0      [点我收藏+]

一、 User Defaults

         1.      是什么?

                 是一个特殊的plist文件

         2.      干什么?

                 用于保存应用的配置信息

         3.      存什么信息?

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

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

                

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

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

                

                 信息:数据版本信息

                 目的:数据迁移

                 1.0

                 1|TXT|数据迁移

                 2.0

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

                

                 信息:默认信息

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

bubuko.com,布布扣
- (void)viewDidLoad

{

    [super viewDidLoad];

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

    // 获取用户默认standardUserDefaults

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

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

   

    [userDefault setBool:YES forKey:@"opened"]; // 设置key值opened

    [userDefault synchronize]; // 同步

}
bubuko.com,布布扣

 

使用User Defaults

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

     提示用户打星

     如果选择先不打那么在运行10次后在提醒直到选择好的则不在提醒

bubuko.com,布布扣
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    // 取出配置文件中的数据
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSInteger runCount = [userDefaults integerForKey:@"runCount"];
    NSInteger nextAlertCount = [userDefaults integerForKey:@"nextAlertCount"];
    NSLog(@"runCount:%d",runCount);
    NSLog(@"nextAlertCount:%d",nextAlertCount);
    // 判断运行次数
    if (runCount == 0) {
        nextAlertCount = 10;
        [userDefaults setInteger:nextAlertCount forKey:@"nextAlertCount"];
    }
    if (runCount == nextAlertCount) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"好用就打个分吧" delegate:self cancelButtonTitle:@"先不打" otherButtonTitles:@"好的", nil];
        [alert show];
    }
    // runCount+1 保存数据
    [userDefaults setInteger:++runCount forKey:@"runCount"];
    [userDefaults synchronize];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0) { // 先不打
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        NSInteger nextAlertCount = [userDefaults integerForKey:@"nextAlertCount"];
        NSInteger runCount = [userDefaults integerForKey:@"runCount"];
        nextAlertCount = runCount + 10;
        [userDefaults setInteger:nextAlertCount-1 forKey:@"nextAlertCount"];
        [userDefaults synchronize];
    }
}
View Code

 

 

二、archive归档

plist是对象和plist之间的转换

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

对象到NSData(归档)步骤:

归档(拆毛衣)

NSObject                                            对象                   毛衣

NSMutableData               字节                   毛线团

NSKeyedArchiver             归档器    拆毛线针

NSCoder                                            字节片段  毛线段

 

反归档(织毛衣)

NSData                                               字节          毛线团

NSKeyedUnarchiver         反归档器   织毛线针

NSObject                                            对象          毛衣

NSCoder                                            字节片段   毛线段

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

                 1)     必须遵循NSCoding协议

                 2)     必须覆盖

                          initWithCoder

                          encodeWithCoder

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

代码如下:

bubuko.com,布布扣
- (void)viewDidLoad

{

    [super viewDidLoad];

    MXPerson *person = [[MXPerson alloc] init];

    person.name = @"张三";

    person.age = 19;

    // 对象 -> NSData    归档

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

    NSMutableData *data = [NSMutableData data];

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

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

    // 3 编码     拆线

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

    // 4 完成     收线

    [archiver finishEncoding];

   

    // NSData  ->  对象

    // 获取到data 构建毛线团

   

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

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

    // 织毛衣

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

   

}
bubuko.com,布布扣

 

 

三、存储总结

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

                   

单词

         Archive             归档                   A. Er1 Kai4 Vu.

         Encode            编码                   Yin3 Kou4 De.

         Decode           解码                   Di1 Kou4 De.

         Coder               码                      Kou1 De.

 

04-IOSCore - User Defaults、Archive、存储总结,布布扣,bubuko.com

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

原文:http://www.cnblogs.com/yangmx/p/3583103.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!