iOS开采经历,名次的榜单完结

在电脑软件里面,Plist文件常用于数据存款和储蓄!

前言

  • 直接将数据写在代码里面,不是一种客观的做法。假如数据常常改,就要平日翻看对应的代码实行修改,变成代码扩展性低。因而,能够思索将平常变的多少放在文件中展展开仓库储,程序运转后从文件中读取最新的多寡。假使要转移数据,间接修改数据文件就可以,不用修改代码。一般能够采用性质列表文件存储NSArray 可能 NSDictionary 之类的数码,这种 “属性列表文件” 的扩大名是 plist,因此也称为 “plist 文件”。 plist 是以 xml 文件方式累积的。

  • 若是指标是 NSString、NSArray、NSDictionary、NSData 和 NSNumber 类型,可以用这几个类中贯彻的 writeToFile: atomically: 方法将数据写到文件中。

  • 当依据字典成立属性列表时,字典中的键必得都以 NSString 对象。数组中的成分或字典中的值能够是 NSString、NSArray、NSDictionary、NSData、NSDate 和 NSNumber 对象。

  • iOS 达成的系列化方式的二种:NSKeyedArchiver,NSPropertyListSerialization。在这二种类别化情势中,NSData 都是种类化的靶子。三种方法的不相同点在于 NSPropertyListSerialization 是指向数组和字典类型的,而 NSKeyedArchiver 是针对对象的。

前言

  • 直白将数据写在代码里面,不是一种客观的做法。假若数额日常改,将在平常翻看对应的代码实行改换,造成代码扩展性低。由此,能够考虑将日常变的数额放在文件中展开仓储,程序运行后从文件中读取最新的多寡。倘使要改变数据,间接修改数据文件就能够,不用修改代码。一般能够应用品质列表文件存款和储蓄NSArray 或许 NSDictionary 之类的数目,这种 “属性列表文件” 的扩张名是 plist,因而也称为 “plist 文件”。 plist 是以 xml 文件格局积累的。

  • 固然目的是 NSString、NSArray、NSDictionary、NSData 和 NSNumber 类型,能够用那几个类中达成的 writeToFile: atomically: 方法将数据写到文件中。

  • 当依照字典创设属性列表时,字典中的键必需都以 NSString 对象。数组中的成分或字典中的值能够是 NSString、NSArray、NSDictionary、NSData、NSDate 和 NSNumber 对象。

  • iOS 达成的体系化格局的三种:NSKeyedArchiver,NSPropertyList塞里alization。在那二种连串化格局中,NSData 都以体系化的靶子。三种办法的差别点在于 NSPropertyListSerialization 是对准数组和字典类型的,而 NSKeyedArchiver 是本着对象的。

目录

  • A.应用包里的“plist文件”

1、Write 写入措施

  • 长久保存在磁盘中。具体方法为:

    • 先是步:获得文件就要保存的门道:

      • 使用 C 函数 NSSearchPathForDirectoriesInDomains 来获取沙盒中目录的全路径。该函数有多个参数,目录项目、domain mask、布尔值。当中布尔值表示是不是需求经过 ~ 扩张路线。何况率先个参数是不改变的,即为 NSSearchPathDirectory 。在 iOS 中后七个参数也是不改变的,即为:NSUserDomainMask 和 YES。

            NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
        
      • 再有一种形式是应用 NSHomeDirectory 函数获得 sandbox 的门道,可是不可能在 sandbox 的正文件层上写文件也不可能成立目录,而应当是此基础上创立三个新的可写的目录,例如Documents, Library 大概 temp 。具体的用法为:

            // 将 Documents 添加到 sandbox 路径上
            NSString *documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
        
      • 这两头的区分就是:使用 NSSearchPathForDirectoriesInDomains 比在 NSHomeDirectory 前边增多 Documents 尤其安全。因为该文件目录只怕在现在出殡的系统上发生转移。

    • 其次步:生成在该路径下的文本:

          // fileName 就是保存文件的文件名
          NSString *FileName = [documentPath stringByAppendingPathComponent:@"fileName"];
      
    • 其三步:往文件中写入数据:

          // 将 NSData 类型对象 data 写入文件,文件名为 FileName
          [data writeToFile:FileName atomically:YES];
      
    • 第四步:从文件中读出多少:

          // 从 FileName 中读取出数据
          NSData *data = [NSData dataWithContentsOfFile:FileName options:0 error:NULL];
      

1、Write 写入措施

  • 恒久保存在磁盘中。具体方法为:

    • 第一步:得到文件就要保存的不二等秘书诀:

      • 采纳 C 函数 NSSearchPathForDirectoriesInDomains 来收获沙盒中目录的全路径。该函数有多个参数,目录项目、domain mask、布尔值。个中布尔值表示是还是不是要求通过 ~ 扩大路线。何况率先个参数是不改变的,即为 NSSearchPathDirectory 。在 iOS 中后多个参数也是不改变的,即为:.DocumentDirectory 和 true。

            let documentPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
        
      • 还应该有一种艺术是利用 NSHomeDirectory 函数获得 sandbox 的不二诀窍,但是无法在 sandbox 的正文件层上写文件也无法创制目录,而相应是此基础上创造贰个新的可写的目录,例如Documents, Library 恐怕 temp 。具体的用法为:

            // 将 Documents 添加到 sandbox 路径上
            let documentPath = NSHomeDirectory().stringByAppendingString("/Documents")
        
      • 这两个的界别便是:使用 NSSearchPathForDirectoriesInDomains 比在 NSHomeDirectory 后边增添 Documents 越发安全。因为该文件目录恐怕在以往出殡和埋葬的种类上发出变动。

    • 第二步:生成在该路径下的文书:

      objc // fileName 就是保存文件的文件名 let FileName = documentPath.stringByAppendingString("/fileName")

    • 其三步:往文件中写入数据:

          // 将 NSData 类型对象 data 写入文件,文件名为 FileName
          data.writeToFile(FileName, atomically: true)
      
    • 第四步:从文件中读出多少:

          // 从 FileName 中读取出数据
          let data = try? NSData(contentsOfFile: FileName, options: NSDataReadingOptions(rawValue: 0))
      
  1. 沙盒及其协会
  2. Preference(偏幸设置)-Plist
  3. 品质列表-Plist
  4. NSKeyedArchiver归档
  5. 数据库
  6. KeyChain
  7. 小结运用境况
  8. 增加补充:关于NSData及数据类型转变
  9. 补充:文件管理器-NSFileManager

2、Plist 文件的读写

    NSString *arrayPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/arrayToPList.plist"];
    NSString *dictionaryPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dictionaryToPList.plist"];

    // 待写入数据
    NSArray *array = @[@"bei", @"jing", @"huan", @"ying", @"nin"];

    // 待写入数据
    NSDictionary *dictionary = @{@"name":@"chen chao", @"age":@"18", @"info":@"Good Teacher"};

    // 写 Plist 文件

        // 数组写入 plist 文件
        BOOL bl1 = [array writeToFile:arrayPath atomically:YES];

        // 字典写入 plist 文件
        BOOL bl2 = [dictionary writeToFile:dictionaryPath atomically:YES];

    // 读 Plist 文件

        NSArray *arrayFromPlist = [NSArray arrayWithContentsOfFile:arrayPath];
        NSDictionary *dicFromPList = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];

2、Plist 文件的读写

    let arrayPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/arrayToPList.plist")
    let dictionaryPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dictionaryToPList.plist")

    // 待写入数据
    let array:NSArray = ["bei", "jing", "huan", "ying", "nin"]

    // 待写入数据
    let dictionary:NSDictionary = ["name":"chen chao", "age":"18", "info":"Good Teacher"]

    // 写 Plist 文件

        // 数组写入 plist 文件
        let bl1:Bool = array.writeToFile(arrayPath, atomically: true)

        // 字典写入 plist 文件
        let bl2:Bool = dictionary.writeToFile(dictionaryPath, atomically:true)

    // 读 Plist 文件

        let arrayFromPlist:NSArray? = NSArray(contentsOfFile: arrayPath)
        let dicFromPList:NSDictionary? = NSDictionary(contentsOfFile: dictionaryPath)
1. 沙盒及其协会

数码的长久化,正是将数据保存到硬盘中,使得在应用程序或机珍视启后方可持续探访从前封存的数据。在iOS开拓中,有数不完数目长久化的方案,本文将先对IOS沙盒文件实行简易介绍,然后深入分析偏幸设置、plist文件、归档、数据库八种常用的方案。
IOS 应用程序常用的数量持久化方法首要有plist文件(属性列表-property list)、归档(NSKeyedArchiver)、偏幸设置(preference)、数据库(SQL、CoreData)。

沙盒介绍:
Apple为了安全考虑,限制iOS应用程序暗中同意景况下只可以访问程序自身的目录,那个目录被称呼“沙盒”。

  • 应用程序在和谐的沙盒中运作,可是不可能访问任何别的应用程序的沙盒;
  • 行使之间无法分享数据,沙盒里的文本不能够被复制到其他应用程序的公文夹中,也不可能把任何使用文本夹复制到沙盒中。

沙盒的目录结构如下:

  • "应用程序包"
  • Documents
  • Library
    • Caches
    • Preferences
  • tmp

有关bundle路线和sandbox沙盒路线:
(1)bundle路线:应用程序 (APP) 在手提式有线电话机里面包车型客车设置路线
(2)沙河路径:特意用来累积App自身多少的贰个路线,iOS为各类app都分配了多个专程用来存款和储蓄这么些app自己的某个数额的路线

沙盒中的种种文件夹都各尽分化,所以在增选数据存款和储蓄时要求选择得当的目录
上边分别介绍:

  • 应用程序包:
    应用程序包里面贮存的根本是应用程序的源文件,富含可施行文件和能源文件,其路线获取情势如下:
NSString *path = [[NSBundle mainBundle] bundlePath];

// 获取应用程序程序包中资源文件路径的方法:
//例如获取程序包中一个图片资源(apple.png)路径的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
//代码中的mainBundle类方法用于返回一个代表应用程序包的对象。
  • 获得根目录路线的函数:
//打印沙盒路径
NSString *homePath = NSHomeDirectory();
  • Documents:
    Documents是最常用的目录,iTunes会同步此文件夹的内容,适合积存首要的数额,其路线获取方式如下:
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
  • 参数1:第三个参数钦定了查究的路子名称,NSDocumentDirectory表示是在Documents中找出,NSCachesDirectory的话正是在cache文件夹中查究
    常用枚举:
    NSDocumentDirectory
    NSCachesDirectory
  • 参数2:
NSUserDomainMask = 1,//用户主目录中
NSLocalDomainMask = 2,//当前机器中
NSNetworkDomainMask = 4,//网络中可见的主机
NSSystemDomainMask = 8,//系统目录,不可修改(/System)
NSAllDomainsMask = 0x0ffff,//全部
  • 参数3:是否举行波浪线,一般为YES展开

  • Library/Caches:
    Library/Caches,iTnues不会一齐此文件夹中的内容,经常适合积攒容积大,无需备份的非首要数据,其路线获取格局如下:

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
  • Library/Preferences:
    Library/Preferences,iTunes会同步此文件夹中的内容,平常用于保存应用的设置新闻,其拿走格局如下:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  • tmp:
    tmp,iTunes不会同步此文件夹,系统也许在利用尚未运营时去除该目录下的公文,适合保存应用中的一些一时文件,用完就删除,路线获取情势如下:
NSString *path = NSTemporaryDirectory();
NSString * path = [[NSBundle mainBundle]pathForResource:@"RankList.plist" ofType:nil];NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:path];for (NSDictionary * dict in plistArray) { [self.dataArray addObject:dict];}

3、Plist 序列化

    NSString *arrayPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/arrayPropertyList.plist"];
    NSString *dictionaryPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dictionaryPropertyList.plist"];

    // 待写入数据
    NSArray *array = @[@"bei", @"jing", @"huan", @"ying", @"nin"];                                                  

    // 待写入数据
    NSDictionary *dictionary = @{@"name":@"chen chao", @"age":@"18", @"info":@"Good Teacher"};                      

    // 序列化,将数据转换成 XML 格式的文件

        NSData *arrayData = [NSPropertyListSerialization dataWithPropertyList:array 
                                                                       format:NSPropertyListXMLFormat_v1_0 
                                                                      options:1 
                                                                        error:nil];

        NSData *dictionaryData = [NSPropertyListSerialization dataWithPropertyList:dictionary 
                                                                            format:NSPropertyListXMLFormat_v1_0 
                                                                           options:1 
                                                                             error:nil];

        // 输出到 .txt 格式文件中
        BOOL bl1 = [arrayData writeToFile:arrayPath atomically:YES];                                                    
        BOOL bl2 = [dictionaryData writeToFile:dictionaryPath atomically:YES];

    // 反序列化

        NSArray *arrayFromeFile = [NSArray arrayWithContentsOfFile:arrayPath];
        NSDictionary *dicitionaryFromeFile = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];

3、Plist 序列化

    let arrayPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/arrayPropertyList.plist")
    let dictionaryPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dictionaryPropertyList.plist")

    // 待写入数据
    let array:NSArray = ["bei", "jing", "huan", "ying", "nin"]

    // 待写入数据
    let dictionary:NSDictionary = ["name":"chen chao", "age":"18", "info":"Good Teacher"]

    // 序列化,将数据转换成 XML 格式的文件

        let arrayData:NSData = try! NSPropertyListSerialization.dataWithPropertyList(array, 
                                                                              format: .XMLFormat_v1_0, 
                                                                             options: 0)

        let dictionaryData:NSData = try! NSPropertyListSerialization.dataWithPropertyList(dictionary, 
                                                                                   format: .XMLFormat_v1_0, 
                                                                                  options: 0)

        // 输出到 .txt 格式文件中
        let bl1:Bool = arrayData.writeToFile(arrayPath, atomically: true)
        let bl2:Bool = dictionaryData.writeToFile(dictionaryPath, atomically:true)

    // 反序列化

        let arrayFromeFile:NSArray = NSArray(contentsOfFile: arrayPath)!
        let dicitionaryFromeFile:NSDictionary = NSDictionary(contentsOfFile: dictionaryPath)!
2. Preference(偏心设置)-plist

NSUserDefaults类提供了与暗许数据库相交互的编制程序接口。其实它存款和储蓄在应用程序的贰个plist文件里,路径为沙盒Document目录平级的/Library/Prefereces里。借使将暗中同意数据库比喻为SQL数据库,那么NSUserDefaults就一定于SQL语句。

常用来存款和储蓄二个简约的意况如是还是不是第一次登入。

NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL,NSData。

  (void)setUserDefaultsValue:(id)value key:(NSString *)key
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:value forKey:key];
    //立即同步
    [userDefaults synchronize];
    //重置清零
//    [NSUserDefaults resetStandardUserDefaults];
}

  (id)objectForKey:(NSString *)key
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:key];
}

总结:

  1. 偏幸设置会把装有数据保存到Library/Preference目录下以利用包命名的plist文件中。
  2. synchronize方法让存款和储蓄立时生效,若无调用,则系统会I/O情形不定期地保存。
  3. 偏疼设置是特别用来保存应用程序的布置消息的,一般不要在偏爱设置中保留别的数据。
  4. 容器(字典、数组)内不容许数据为空!
  5. NSUserDefaults再次来到的值是不可变的,固然保存时值是可变的。比如:设定贰个可变字符串为MyStringDefault的值,之后用stringForKey:获取到的字符串将不可变。
  6. NSUserDefaults是线程安全的。
  7. 无法不保障每二个Key的独一性,一样的key会被遮蔽

创建:

4、Plist 文件的采用

4、Plist 文件的应用

3. 品质列表-Plist化

Plist是三个行业内部的保存文本和设置的方法,后缀为.plist,Plist的数目能够是XML格式或二进制格式,也得以在那二种格式间转移,
Plist协理数据类型有NSData、NSDate、NSNumber、NSString、NSArray和NSDictionary,writeToFile:atomically: 方法会自动物检疫查测量试验数据类型,倘诺不是那么些项目,会回到false;反之,再次来到true。

是因为质量列表本人不加密,所以安全性大约能够说为零。因为,属性列表平日用于存款和储蓄一丢丢的同一时候不重大的数目。

能够被连串化的类独有Apple系统提供的以下两种:

NSString
NSMutableString
NSData
NSMutableData
NSArray
NSMutableArray
NSDictionary
NSMutableDictionary
NSNumber
NSDate

总结:

  1. 唯有以上项目本领运用plist文件存款和储蓄,无诗歌件命名也许存款和储蓄地方怎么,连串化均为XML
  2. writeToFile: atomically:方法。 个中atomically表示是或不是须求先写入贰个赞助文件,再把帮扶文件拷贝到指标文件地方。那是更安全的写入文件格局,一般都写YES。
  3. 读取时用XXXWithContentsOfFile:方法

字符串写入本地
有有个别须求小心,就是存取字符串的时候,就算Plist也得以积累字符串,可是最棒不用采用plist文件,因为plist本人不援助字符串(plist文件其根节点处,唯有数组和字典多个选拔),并且字符串的存取方法也早就晚点。
把字符串保存为文本文件很简单。大家得以读取文本文件,而且文本文件是夸平台数据类型
存取字符串方法:依然是write方法,只可是是把.plist改为.txt

#pragma mark - NSString_plist
- (void)setNSString_plist
{
    NSString *str = @"NSString_path";
    //NSString *path = [[DataManager shareDataManager]  getPath:@"str.plist"];
    NSString *path = [[DataManager shareDataManager]  getPath:@"str.txt"];

    [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
    [self getNSString_plist];
}

- (void)getNSString_plist
{
    NSString *path = [[DataManager shareDataManager]  getPath:@"str.txt"];
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",str);
}

数组写入本地

#pragma mark - NSArray_plist
- (void)setNSArray_plist
{
    NSArray *array = @[@"plist_a",@"plist_b",@"plist_c"];
    NSString *path = [[DataManager shareDataManager]  getPath:@"array_plist.plist"];
    [array writeToFile:path atomically:YES];
    [self getNSArray_plist];
}

- (void)getNSArray_plist
{
    NSString *path = [[DataManager shareDataManager]  getPath:@"array_plist.plist"];
    NSArray *array = [NSArray arrayWithContentsOfFile:path];
    NSLog(@"%@",array);
}

图片 1plist文件的创造

4.1 Plist 文件的创导

图片 2

4.1 Plist 文件的开创

图片 3

4. NSKeyedArchiver归档

与本性列表相反,一样作为轻量级存款和储蓄的长久化方案,数据归档是进展加密管理的,数据在通过归档管理会转变来二进制数据,所以安全性要远远超过属性列表。其它利用归档格局,我们得以将复杂的指标写入文件中,何况不管添扩展少对象,将目的写入磁盘的方式没什么差别样的。

归档对象分类:

  • 对 Foundation 库中目的开展归档
  • 自定义对象开展归档 (须求达成归档公约、NSCoding)

使用NSKeyedArchiver对自定义的数据开展系列化,并且保留在沙盒目录下。使用这种归档的前提是让存款和储蓄的数据模型坚守NSCoding共同商议业景而且达成其多少个公约章程。(当然,尽管为了进一步安全的囤积,也得以遵守NSSecureCoding协商,那是iOS6从此新增加的表征)

  • 归档在iOS中是另一种情势的种类化,保存的数码是二进制格式。
  • 假定遵照了NSCoding合同落到实处了initWithCoder:和encodeWithCoder:方法的靶子都足以通过它完结系列化,存款和储蓄在文书中。
  • 承继时,需求调用 [super encodeWithCoder:encoder]和[super initWithCoder:decoder]方法。

总结:

  1. 一经急需归档的类中包含有个别属性是自定义的类的实例,则需求相应的类也兑现NSCoding合同,如示例中的ArchiverModel。
  2. 保留文件的恢弘名能够无限制钦定。
  3. 若是急需归档的类是有些自定义类的子类时,就需求在归档和平消除档从前先完成父类的存档和平化解档方法。即
 [super encodeWithCoder:aCoder] 

 [super initWithCoder:aDecoder] 
  1. 归档实际不是数码长久化,而是帮忙复杂对象转化成轻巧对象的一种方式,真正落实多少漫长化的依然是writeToFile写入文件

归档四个Array

#pragma mark - 归档一个Array
- (void)setNSArray
{
    NSArray *array = @[@"archiver_a",@"archiver_b",@"archiver_C"];
    NSString *path = [[DataManager shareDataManager] getPath:@"array_archiver.plist"];
    BOOL archiver = [NSKeyedArchiver archiveRootObject:array toFile:path];
    if (archiver) {
        [self getNSArray_archiver];
    }
}
- (void)getNSArray_archiver
{
    NSString *path = [[DataManager shareDataManager]  getPath:@"array_archiver.plist"];
    NSArray *array =[NSKeyedUnarchiver unarchiveObjectWithFile:path];

    NSLog(@"%@",array);
}

归档单个自定义对象

#pragma mark - 归档单个自定义对象
- (void)setModel_archiver
{

    //方法1.
    ArchiverModel *model = [[ArchiverModel alloc]initWithName:@"aaa" Age:12];
    NSString *path = [[DataManager shareDataManager]  getPath:@"model_archiver_one.plist"];
    //使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中
    BOOL archiver = [NSKeyedArchiver archiveRootObject:model toFile:path];


    //方法2.
    NSString *path1 = [[DataManager shareDataManager]  getPath:@"model_archiver_one_2.plist"];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];
    [data writeToFile:path1 atomically:YES];

    //读取
    if (archiver) {
        [self getModel_archiver];
    }
}

- (void)getModel_archiver
{
    //方法1读取.
    NSString *path = [[DataManager shareDataManager]  getPath:@"model_archiver_one.plist"];
    ArchiverModel *model =[NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@,%ld",model.name,model.age);

    //方法2读取.
    NSString *path1 = [[DataManager shareDataManager]  getPath:@"model_archiver_one_2.plist"];
    NSData *data = [NSData dataWithContentsOfFile:path1];
    ArchiverModel *model1 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"%@,%ld",model1.name,model1.age);
}

多少个自定义对象归档解档

#pragma mark - 归档多个对象
- (void)setModel_more_arch
{
//    通过NSData 和 NSKeyedArchive 实现一个文件归档多个对象
        ArchiverModel *model = [[ArchiverModel alloc]initWithName:@"aaaa" Age:22];
    ArchiverModel *model1 = [[ArchiverModel alloc]initWithName:@"bbbb" Age:100];
    NSString *path = [[DataManager shareDataManager] getPath:@"model_archiver_more.plist"];
        //1.创建可变data:容器
    NSMutableData *muData = [NSMutableData data];
    //2.创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:muData];
        //3.归档
    [archiver encodeObject:model forKey:@"model_encode"];
    [archiver encodeObject:model1 forKey:@"model1_encode"];
    //4.归档完成
    [archiver finishEncoding];
        [muData writeToFile:path atomically:YES];
    [self getModel_more_arch];
 }

- (void)getModel_more_arch
{
    NSString *path = [[DataManager shareDataManager]  getPath:@"model_archiver_more.plist"];
    NSMutableData *muData = [NSMutableData dataWithContentsOfFile:path];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:muData];
    ArchiverModel *model= [unarchiver decodeObjectForKey:@"model_encode"];
    ArchiverModel *model1= [unarchiver decodeObjectForKey:@"model1_encode"];
    [unarchiver finishDecoding];
    NSLog(@"%@,%ld",model.name,model.age);
    NSLog(@"%@,%ld",model1.name,model1.age);
}

注意应用包里的plist文件 只好读取数据!不能够写入数据!

[NSBundle mainBundle]获得到的门路下的公文 无法修改

NSString * path = [[NSBundle mainBundle] pathForResource:@"gg.plist" ofType:nil];NSDictionary * plistDict = [[NSDictionary alloc] initWithContentsOfFile:path];NSLog(@"plistDict:%@",plistDict); NSDictionary * addDict = @{ @"score":@"123", @"name":@"adama" };if ([addDict writeToFile:path atomically:YES]) { NSLog(@"将数组保存为属性列表文件成功!!"); NSDictionary * plistDict = [[NSDictionary alloc] initWithContentsOfFile:path]; NSLog(@"plistDict:%@",plistDict);}else{ NSLog(@"将数组保存为属性列表文件不成功");}

打字与印刷效果:

2017-08-26 10:03:31.734 plistTest[1604:54082] plistDict:{}2017-08-26 10:03:31.735 plistTest[1604:54082] 将数组保存为属性列表文件成功!!2017-08-26 10:03:31.735 plistTest[1604:54082] plistDict:{ name = ada; score = da;}

展现存款和储蓄成功!但不用一蹴而就! plist文件始终不改变:

图片 4plist文件 始终为空

4.2 Plist 文件的分析

    // 获得 Plist 文件的全路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];

    // 加载 plist 文件
    NSArray *shops = [NSArray arrayWithContentsOfFile:path];

4.2 Plist 文件的分析

    // 获得 Plist 文件的全路径
    let path = NSBundle.mainBundle.pathForResource(@"shops", ofType:@"plist")

    // 加载 plist 文件
    let shops:NSArray? = NSArray(contentsOfFile: path)
5. 数据库

http://www.jianshu.com/p/90be4fedeb8c

  • B.沙盒中的“plist文件”

4.3 Plist 文件的分析进度

图片 5

4.3 Plist 文件的深入分析进程

图片 6

6. KeyChain

能够用来保存安全敏感的多寡,举例顾客名密码。

4.4 Plist 的使用注意

  • plist 的公文名无法叫做 “info”、“Info” 之类的。

  • 加上 plist 等公事财富的时候,绝对要勾选上面包车型地铁选项。

    图片 7

4.4 Plist 的利用注意

  • plist 的文件名不能够叫做 “info”、“Info” 之类的。

  • 丰裕 plist 等公事财富的时候,应当要勾选上边包车型大巴选项。

    图片 8

7. 总计运用意况
  • NSUserDefaults:

    • 貌似用bool值大概字符串,不要用array,和dic,不然当null时会crash
    • 多用在认清是或不是第三遍登陆
  • Plist文件:用在系统Foundation 库中目的,首倘使 dic和array;

  • txt文件:用在字符串,number;

  • 归档:用于自定义对象;

  • 数据库:大型数据.

文件格式:

  • "名字任性":NSKeyedArchiver
  • .plist:数组,字典
  • .txt: 字符串,NSNumber
  • .data:二进制文件,别的数据类型能够经过NSData进行改换存款和储蓄.
  • .png:图片
  • .xml:...
NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整沙盒路径NSString *documentsDirectory = [sandboxpath objectAtIndex:0];//documents路径NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];NSArray * plistDataArray = [[NSArray alloc] initWithContentsOfFile:plistPath];for (NSDictionary * dict in plistDataArray) { [self.dataArray addObject:dict];}
8. 互补:关于NSData及数据类型转换

NSData首要是提供一块原始数据的包裹,用来包装数据的,NSData存款和储蓄的是二进制数据,方便数据的包装与流动,屏蔽了多少里面包车型大巴歧异,文本、音频、图像等数据都可用NSData来积攒。相比普及的是NSString/NSImage数据的包装与传递。在选用中,最常用于访谈存款和储蓄在文件中、网络能源中的数据以及在多媒体开拓时,相比较常用,比方拼接音频、图片。

注意
能够让数组,字典,字符串等直接写入本地,也能够先把它们(以致包含自定义对象)调换为NSData二进制文件再写入,这三种都足以,只可是前者多了一步二进制文件调换。

NSData相关材质:
http://www.jianshu.com/p/0e95b992e061

出于删除、增加、修改数据(思量到是或不是留存Plist文件?),故而Plist文件采用在沙盒中开创、使用:全局变量:

9. 互补:文件处理器:NSFileManager
    //创建文件管理对像
    NSFileManager *mangager = [NSFileManager defaultManager];
    //创建
    [mangager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
    //移动
    [manager moveItemAtPath:oldPath toPath:newPath error:nil];
    //复制
    [manager copyItemAtPath:oldPath toPath:newPath error:nil];
    //删除
    [manager removeItemAtPath:filePath error:nil];

    //判断是否存在
    BOOL isExist = [manager fileExistsAtPath:filePath];
    if (isExist) {
        NSLog(@" 文件存在");
    }else
    {
        NSLog(@" 文件不存在");
    }
NSString * _jifenStr; //积分数NSString * _nameStr; //用户名int _indexWhereAdd; //插入的位置

操作步骤:

NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整路径NSString *documentsDirectory = [sandboxpath objectAtIndex:0];//沙盒document路径,放着plist文件NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"];//plist文件路径BOOL hasTheRightPlist = NO; //文档路径下 是否含有plist文件NSFileManager * fileManger = [NSFileManager defaultManager]; //文件管理类NSArray * dirArray = [fileManger contentsOfDirectoryAtPath:documentsDirectory error:nil];for (NSString * str in dirArray) { //遍历文件夹(沙盒document路径) if ([str isEqualToString:@"RankList.plist"]) { //含有“RankList.plist” hasTheRightPlist = YES; }}if (hasTheRightPlist == YES) { //沙盒document路径 含有“RankList.plist”文件 NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:plistPath]; for (int i = 0; i < plistArray.count; i  ) { NSDictionary * dict = plistArray[i]; //比较 历史积分、当前积分 进行排行 if([_jifenStr integerValue] > [dict[@"score"] integerValue] ) {//大于 直接插入 UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil]; [alertV setAlertViewStyle:UIAlertViewStylePlainTextInput]; UITextField * textName = [alertV textFieldAtIndex:0]; textName.placeholder = @"请输入名字"; textName.clearButtonMode = UITextFieldViewModeWhileEditing; [alertV show]; alertV.tag = 0; _indexWhereAdd = i; break; } else { //小于 if (i == plistArray.count-1 && plistArray.count < 10) { //最后一位 && 个数没超过排行榜限制 UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil]; [alertV setAlertViewStyle:UIAlertViewStylePlainTextInput]; UITextField * textName = [alertV textFieldAtIndex:0]; textName.placeholder = @"请输入名字"; textName.clearButtonMode = UITextFieldViewModeWhileEditing; [alertV show]; alertV.tag = 1; _indexWhereAdd = i; break; } } }} else { UIAlertView * alertV = [[UIAlertView alloc] initWithTitle:@"提交分数" message:@"恭喜进入排行榜" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确认", nil]; [alertV setAlertViewStyle:UIAlertViewStylePlainTextInput]; UITextField * textName = [alertV textFieldAtIndex:0]; textName.placeholder = @"请输入名字"; textName.clearButtonMode = UITextFieldViewModeWhileEditing; [alertV show]; alertV.tag = 2; //文件夹下,不存在plist文件 直接添加,必定要创建plist文件 }

UIAlertView协议: 存储顾客数量

#pragma mark - UIAlertViewDelegate-alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { UITextField * textNameTF = [alertView textFieldAtIndex:0]; _nameStr = textNameTF.text; //用户名 if (buttonIndex == 0 && _nameStr.length > 0) { //确认按钮 NSArray *sandboxpath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //获取完整路径 NSString *documentsDirectory = [sandboxpath objectAtIndex:0]; NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"RankList.plist"]; NSArray * plistArray = [[NSArray alloc] initWithContentsOfFile:plistPath]; NSMutableArray * addToPlistArr; //存储的数组 if (plistArray) { addToPlistArr = plistArray.mutableCopy; } else { //plist数组 不存在 addToPlistArr = @[].mutableCopy; } NSDictionary * addDict = @{ @"score":_jifenStr, @"name":_nameStr }; switch (alertView.tag) { case 0:{ [addToPlistArr insertObject:addDict atIndex:_indexWhereAdd]; if (addToPlistArr.count > 10) { //超过10位,移除最后一位 [addToPlistArr removeObjectAtIndex:(addToPlistArr.count-1)]; } if ([addToPlistArr writeToFile:plistPath atomically:YES]) { NSLog(@"将数组保存为属性列表文件成功!!"); }else{ NSLog(@"将数组保存为属性列表文件不成功"); } }break; case 1:{ [addToPlistArr addObject:addDict]; if ([addToPlistArr writeToFile:plistPath atomically:YES]) { NSLog(@"将数组保存为属性列表文件成功!!"); }else{ NSLog(@"将数组保存为属性列表文件不成功"); } }break; case 2:{ //文件夹下,不存在plist文件 ❤️❤️❤️直接添加,会先创建plist文件❤️❤️❤️ [addToPlistArr addObject:addDict]; if ([addToPlistArr writeToFile:plistPath atomically:YES]) { NSLog(@"将数组保存为属性列表文件成功!!"); }else{ NSLog(@"将数组保存为属性列表文件不成功"); } }break; default: break; } } else { //AlertView里没有输入任何信息 MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.mode = MBProgressHUDModeText; hud.label.text = @"选择默默无闻,分数不保存"; hud.margin = 10.f; hud.offset = CGPointMake; hud.removeFromSuperViewOnHide = YES; [hud hideAnimated:YES afterDelay:1.5f]; } //NSLog(@"%ld",buttonIndex);}

逻辑判定

剖断文件夹路线下是不是有“RankList.plist”文件:

  • 不满含:创立“RankList.plist”文件,并丰裕八个指标音讯(字典:Dictionary)

  • 包含:存款和储蓄的数目 排序(积分:_jifenStr)

    • 胜出 “RankList.plist”文件中任一成分多少(Dictionary):直接插入相应的职位。

      若插入数据后,若数组个数超越限制:必要移除最后叁个因素。

    • 不高于 “RankList.plist”文件中任一成分数量(Dictionary):

      • 数组个数 超过界定:不做拍卖

      • 数组个数 不超过界定:直接抬高到数组最前边

goyohol's essay

本文由星彩网app下载发布于计算机编程,转载请注明出处:iOS开采经历,名次的榜单完结

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。