zoukankan      html  css  js  c++  java
  • OC-常见归档总结

    /*****  该文一共总结了以下六种文件操作   1.NSKeyedArchiver、 2.对类对象进行归档 <NSCoder>协议 3.文件管理类 NSFileManger  4.对文件操作 plist 5.NSUserDefault 单例类 6.Json解析********/

     /*

       1.如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中   

          将一个NSDictionary对象归档到一个plist属性列表中

          // 将数据封装成字典------------------------------------------------

          NSMutableDictionary *dict = [NSMutableDictionary dictionary];

          [dict setObject:@"母鸡" forKey:@"name"];

          [dict setObject:@"15013141314" forKey:@"phone"];

          [dict setObject:@"27" forKey:@"age"];

          // 将字典持久化到Documents/stu.plist文件中

          [dict writeToFile:path atomically:YES];

          读取属性列表,恢复NSDictionary对象-------------------------------------

          // 读取Documents/stu.plist的内容,实例化NSDictionary

          NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

          NSLog(@"name:%@", [dict objectForKey:@"name"]);

          NSLog(@"phone:%@", [dict objectForKey:@"phone"]);

          NSLog(@"age:%@", [dict objectForKey:@"age"]);

      2.注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还          没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入

            [defaults synchornize];

      3.如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复

      4.不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以

      5.NSCoding协议有2个方法:

          encodeWithCoder:

          每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

          initWithCoder:

          每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量

      

      6.如果父类也遵守了NSCoding协议,请注意:

          应该在encodeWithCoder:方法中加上一句

          [super encodeWithCode:encode];

          确保继承的实例变量也能被编码,即也能被归档

          应该在initWithCoder:方法中加上一句

          self = [super initWithCoder:decoder];

          确保继承的实例变量也能被解码,即也能被恢复

      7.使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象

         NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。可以使用[NSMutableData data]创建可变数据空间

      

     */

    #pragma mark 一、 NSKeyedArchiver=========================================================

    #pragma mark NSKeyedArchiver 第一种方式:存储一种数据。============================

            

    /*

        【注】归档的文件都是经过简单加密的,打不开,也是不允许打开的。

        第一种写法

        对象--文件

        创建了一个数组,初始化了一些数据

        NSArray* array = [[NSArray alloc]initWithObjects:@"zhangsan",@"lisi",@"wanger",@"xiaoming", nil];

        

        先指定要保存的文件名称以及路径

        NSHomeDirectory()就是当前系统的home路径

        stringByAppendingPathComponent 添加一个文件,文件名是:file

        文件类型可以不写,文件名称和后缀随便

        归档文件路径

        NSString* filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"file.txt"];

        

        NSKeyedArchiver 这个类是用来归档的类

        返回值代表归档是否成功

        【注】如果对同一个路径下的同一个文件进行归档操作,就会覆盖掉旧的。

        BOOL isSuccess = [NSKeyedArchiver archiveRootObject:array toFile:filePath];

        if (isSuccess == YES) {

            NSLog(@"文件保存成功");

        }

        

        解归档-----------------------------

        NSArray* Arr = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

        NSLog(@"取出的数据是:%@",Arr);

     */

    #pragma mark NSKeyedArchiver 第二种方式:存储并行数据(存储多种数据)============================

    /*

        第二种写法:

        NSArray* array1 = @[@"one",@"two",@"three"];

        NSDictionary* dic = @{@"key":@"value"};

        NSString* str = @"我是中国人,我爱中国";

        

        NSData 数据流类

        用来存储复杂的数据,把复杂的数据转成数据流格式,可以方便进行存储和传输。

        例如:图片、大文件

        断点续传,假如图片有20M大,

        发邮件:添加附件

        NSMutableData* data = [[NSMutableData alloc]init];

        

        initForWritingWithMutableData 指定要写入的数据流文件

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

        

        编码数据,参数一:要准备编码的数据;参数二:编码数据的key,key随便写

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

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

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

        

        编码完成

        [archiver finishEncoding];

        

        指定文件路径

        NSString* filePath2 = [NSHomeDirectory() stringByAppendingPathComponent:@"file2"];

        

        写入文件

        [data writeToFile:filePath2 atomically:YES];

        下部分解档-------------------------------------------------

        先把路径下的文件读入数据流中

        NSMutableData* fileData = [[NSMutableData alloc]initWithContentsOfFile:filePath];

        

        把数据流文件读入到了 解归档中

        NSKeyedUnarchiver* unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:fileData];

        

        进行解归档

        NSArray* UnArray = [unArchiver decodeObjectForKey:@"array1"];

        NSDictionary* UnDic = [unArchiver decodeObjectForKey:@"dic"];

        NSString* UnStr = [unArchiver decodeObjectForKey:@"str"];

        

        打印

        NSLog(@"%@ %@ %@ ",UnArray,UnDic,UnStr);

     */

    #pragma mark 二、 对类对象进行归档 <NSCoder>协议=========================================================

    /*

        归档方式:对类对象进行归档

        1.先在类的头文件中实现<NSCoding>协议

        2.在.m中重新编码和解码协议。

        【注】forKey:是字符串;编码方法和解码方法字符串要一致

        重新initWithCoder 解码方法

        -(id)initWithCoder:(NSCoder *)aDecoder

        {

            NSLog(@"我是解码方法,我负责解码");

            self = [super init];

            if (self) {

                _name = [aDecoder decodeObjectForKey:@"name"];

                _phone = [aDecoder decodeObjectForKey:@"phone"];

                _number = [aDecoder decodeIntForKey:@"number"];

            }

            return  self;

        }

        

        重新编码方法

        -(void)encodeWithCoder:(NSCoder *)aCoder

        {

            [aCoder encodeObject:_name forKey:@"name"];

            [aCoder encodeObject:_phone forKey:@"phone"];       

       [aCoder encodeInt:_number forKey:@"number"];

        }

       Person *per = [[Person alloc] init];

            per.name = @"哈哈";

            per.phone = @"12123";

            per.number = 20;

            //创建文件保存路径

            NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"file2.txt"];

        //归档

            [NSKeyedArchiver archiveRootObject:per toFile:filePath];

            //解档

            Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

            //打印

            NSLog(@"%@ %@ %d",p1.name,p1.phone,p1.number);    

     */

            

    #pragma mark 三、文件管理类 NSFileManger=====================================================================

    /*

        1.文件路径

        根路径

        NSString* homePath = NSHomeDirectory();

        

         oc中有三个目录是可以操作的:

         1.Documents//文稿目录

         2.tmp//临时目录:程序退出的时候,临时目录内容可能会被情况

         3.library--->Cache//缓存目录//app目录下

        

        

        获取Documents  目录

        写法一

        NSString* Documents = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

        写法二

        NSString* Documents1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDirectory, YES) objectAtIndex:0];

        

        获取应用程序的主目录

        NSString* userName = NSUserName();

        NSString* rootPath = NSHomeDirectoryForUser(userName);

        NSLog(@"app root path:%@",rootPath);

        

        获取cache目录

        NSString* cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

        NSLog(@"cache :%@",cachePath);

        

        获取tmp目录

        NSString* tmpPath = NSTemporaryDirectory();

        NSLog(@"tmp:%@",tmpPath);

        

        2.创建目录和文件

        获取根目录

        NSString* homePath = NSHomeDirectory();

        

        创建了一个文件管理器

        NSFileManager* fileMgr = [NSFileManager defaultManager];

        

        拼接出想要创建的文件路径

        NSString* filePath = [NSString stringWithFormat:@"%@/myFolder",homePath];

        

        创建文件目录

        第一个参数传入想要创建的文件目录,第二个参数指导是否创建不存在的文件夹,yes代表创建

        BOOL isOk = [fileMgr createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];

        if (isOk) {

            NSLog(@"创建文件目录成功");

        }

        

        NSString* string = @"我爱记歌词";

        把内容写入到指定路径下的指定文件中

        BOOL isWriteOk = [string writeToFile:[NSString stringWithFormat:@"%@/1.txt",filePath] atomically:YES encoding:NSUTF8StringEncoding error:nil];

        if (isWriteOk) {

            NSLog(@"写入文件成功");

        }

        

        数组保存

        NSArray* array = @[@"我是一",@"我是三",@"我是周7"];

        BOOL isWriteOK1 = [array writeToFile:[NSString stringWithFormat:@"%@/2.txt",filePath] atomically:YES];

        if (isWriteOK1) {

            NSLog(@"数组写入文件成功");

        }

        

        字典保存

        NSDictionary* dic = @{@"key":@"value"};

        BOOL isWriteOK2 = [dic writeToFile:[NSString stringWithFormat:@"%@/3.txt",filePath] atomically:YES];

        if (isWriteOK2) {

            NSLog(@"字典写入文件成功");

        }

           字符串读取文件内容

        NSString *str1 = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@/1.txt",filePath]     encoding:NSUTF8StringEncoding error:nil];

              数组获取文件内容

             NSArray *arr1 = [NSArray arrayWithContentsOfFile:[NSString stringWithFormat:@"%@/2.txt",filePath]];

             字典获取文件内容

             NSDictionary *dic1 = [NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"%@/3.txt",filePath]];

        2.对文件进行重命名

        

        获取根目录

        NSString* homePath = NSHomeDirectory();

        

        创建了一个文件管理器

        NSFileManager* fileMgr = [NSFileManager defaultManager];

        

        拼接出想要创建的文件路径

        NSString* filePath = [NSString stringWithFormat:@"%@/myFolder/1.txt",homePath];

        

        [fileMgr moveItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/ai.txt",homePath] error:nil];

        

        3.删除一个文件

        声明了一个错误信息的对象

        NSError* error;

        

        获取根目录

        NSString* homePath = NSHomeDirectory();

        

        创建了一个文件管理器

        NSFileManager* fileMgr = [NSFileManager defaultManager];

        

        拼接出想要创建的文件路径

        NSString* filePath = [NSString stringWithFormat:@"%@/myFolder/3.txt",homePath];

        

        删除文件

        如果方法执行返回是NO,error会保存错误信息,如果方法执行返回是YES,error = nil

        BOOL isok = [fileMgr removeItemAtPath:filePath error:&error];

        if (isok) {

            NSLog(@"删除文件成功");

        }

        else

        {

            NSLog(@"删除文件失败");

            打印错误信息

            NSLog(@"%@",error.localizedDescription);

        }

        

        Δ【扩展】NSError类,是一个错误信息类

        删除文件

        如果方法执行返回是NO,error会保存错误信息,如果方法执行返回是YES,error = nil

        BOOL isok = [fileMgr removeItemAtPath:filePath error:&error];

        

        ∆4.删除目录下的所有文件

        获取根目录

        NSString* homePath = NSHomeDirectory();

        

        创建了一个文件管理器

        NSFileManager* fileMgr = [NSFileManager defaultManager];

        

        拼接出想要创建的文件路径

        NSString* filePath = [NSString stringWithFormat:@"%@/myFolder/3.txt",homePath];

        如果删除的目录中不带具体的文件,则删除的是整个目录

        [fileMgr removeItemAtPath:[NSString stringWithFormat:@"%@/myFolder/",homePath] error:nil];

        

        5.获取目录下的所有文件

        获取根目录

        NSString* homePath = NSHomeDirectory();

        

        创建了一个文件管理器

        NSFileManager* fileMgr = [NSFileManager defaultManager];

        

        拼接出想要创建的文件路径

        NSString* filePath = [NSString stringWithFormat:@"%@/myFolder/",homePath];

        

        获取当前目录下的所有文件,包括隐藏文件

        NSArray* allFile = [fileMgr contentsOfDirectoryAtPath:filePath error:nil];

        NSLog(@"%@",allFile);

        

        获取当前目录以及子目录的所有文件

        NSArray* subAllFile = [fileMgr subpathsOfDirectoryAtPath:filePath error:nil];

        

        

        6.文件的属性

        获取根目录

        NSString* homePath = NSHomeDirectory();

        

        创建了一个文件管理器

        NSFileManager* fileMgr = [NSFileManager defaultManager];

        

        拼接出想要创建的文件路径

        NSString* filePath = [NSString stringWithFormat:@"%@/myFolder/3.txt",homePath];

        

        NSDictionary* fileAttribute = [fileMgr fileAttributesAtPath:filePath traverseLink:YES];

        获取文件的属性

        NSData* data = [fileAttribute objectForKey:NSFileModificationDate];

        NSLog(@"文件的创建日期:%@",data);

        

        文件占多少字节

        NSNumber * number = [fileAttribute objectForKey:NSFileSize];

        NSLog(@"文件的大小:%@",number);

        判断文件是否存在

        NSFileManager *fileManager = [NSFileManager defaultManager];

        BOOL isExist = [fileManager fileExistsAtPath:filePath];

    */

            

    #pragma mark 四、对文件操作 plist=======================================================        

    /*

            

         一、plist文件的操作=====================================

        .plist文件是一个属性字典数组的一个文件;

        .plist文件可以用来存储:字典、数组、字符串等对象数据,可以混搭存储

        【注】iOS开发中,plist文件一般用于app的配置信息

        【注】ios开发工程中,允许多个plist文件共存。

        【注】plist文件用来存储小数据量的数据

         优点:可视化以及可编辑性非常方便

         1.创建plist文件----------------------------------------------------------------

         NSMutableDictionary* dic = [[NSMutableDictionary alloc]init];

         

         

         [dic setObject:@"张三" forKey:@"name"];

         [dic setObject:@"李四9999" forKey:@"name1"];

         [dic  setObject:@"王二" forKey:@"name2"];

         

         【注】如果key相同,数据会被冲掉

         [dic setObject:@"zhangsan" forKey:@"name"];

         

         把数据写入文件

         [dic writeToFile:Path atomically:YES];

         atomically

         atomically: 参数意思,原子操作

         如果atomically的参数是yes,程序会把数据先备份一下,等全部写入到了缓存中再一次性写入文件

         如果atomically的参数是no,程序会直接把数据写入缓存

         

         2.创建一种多键值的plist文件---------------------------------------------------------

         NSMutableDictionary* plugin1 = [[NSMutableDictionary alloc]init];

         

         [plugin1 setObject:@"张三1" forKey:@"name1"];

         [plugin1 setObject:@"李四" forKey:@"name2"];

         

         NSMutableDictionary* plugin2 = [[NSMutableDictionary alloc]init];

         

         [plugin2 setObject:@"王二" forKey:@"name1"];

         [plugin2 setObject:@"赵五" forKey:@"name2"];

         NSMutableDictionary* listDic = [[NSMutableDictionary alloc]init];

         [listDic setObject:plugin1 forKey:@"初中一班"];

         [listDic setObject:plugin2 forKey:@"初中二班"];

         

         [listDic setObject:@"一哥" forKey:@"name"];

         

         [listDic writeToFile:Path atomically:YES];

         

         3.对某一个属性进行修改----------------------------------------------------------------

         ∆首先应该先读取当前plist文件,读出所有数据

         读取指定目录下的文件内容

         NSMutableDictionary* appList = [[NSMutableDictionary alloc]initWithContentsOfFile:Path];

         

         [appList setObject:@"二哥" forKey:@"name"];

         

         NSMutableDictionary* chu1 = [appList objectForKey:@"初中一班"];

         NSString* name1 = [chu1 objectForKey:@"name1"];

         [[appList objectForKey:@"初中一班"] objectForKey:@"name1"];

         通过取出的内容,重新组合一个新的内容,把新的内容数据重新存入plist中

         [chu1 setObject:@"qianfeng" forKey:@"name1"];

         [appList setObject:chu1 forKey:@"初中一班"];

         [appList writeToFile:Path atomically:YES];

         【总结】

         1.plist文件操作其实就是一个根目录是字典,内部数据各种嵌套操作。

         2.如果想要修改plist中的某个字段内容,一层一层去找,找到后一层一层封装回来,重新写入文件。(文件的覆盖过程)

         3.plist不允许出现key值重名,如果重名,会把之前的名称下的值给冲掉。

     */

    #pragma mark 五、NSUserDefault 单例类==========================================================

    /*

        一.NSUserDefault 对文件进行存储的类================================

        0.NSUserDefaults 是一个单例类,调用单例方法

        1. NSUserDefault是一个本地数据存储类,可以存储小数据量的信息。

        2. NSUserDefault 在iOS中常用来存储用户的个人信息,以及登陆注册信息。

       【注】1.NSUserDefault 可以存储的数据类型有:NSNumber(NSInterger、flost、double),NSDictionary,NSArray、Bool,NSString这些数据类型

         2.到目前为止,所学的归档、写文件、NSUserDefault都是存储小数据量信息的类,他们可以存储大数据量但是会出现性能问题。存储大数据量信息用【数据库】

        【数据库】

        1.SQlite 底层的数据,需要自己手动去创建数据库文件(db),并且需要手动去书写sqlite 语句;

        2.【core data】是苹果公司提供的一种数据库存储、查询、修改、删除等操作一种解决方案;core data数据库其实就是一个对sqlit3进行封装的类库。

        3.第三方数据库。

        例:

         文件的存储-----------------------------------------------------------------------------

         NSUserDefaults* defaul = [NSUserDefaults standardUserDefaults];

         

         NSArray* classInfo = @[@"初中一班",@"66个同学",@"平均成绩99.98",@{@"key":@"value"}];

         设置key和value

         [defaul setObject:classInfo forKey:@"clss_Info"];  //  数组

         [defaul setObject:@"15588605664" forKey:@"userName"];

         [defaul setObject:@"123456" forKey:@"password"];

         [defaul setObject:@"YES" forKey:@"status"];    // YES 就是1  NO 就是 0

         [defaul setBool:YES forKey:@"status"];

         [defaul setInteger:1 forKey:@"int"];

         [defaul setObject:[NSNumber numberWithBool:YES] forKey:@"status1"];

         [defaul setFloat:0.15 forKey:@"float"];

         把设置的内容存储到程序给NSUserDefaults所分配的空间文件中

         系统会把NSUserDefaults存储的文件都放到app的一个指定的目录,其实这个目录就是在根目录的library目录下一个新的目录下

         [defaul synchronize];

         [注]synchronize 一定要写这个方法,可以确保数据万无一失,如果不写这个方法,可能会存在数据没有保存成功的情况,例如在多线程中进行数据保存;

         读取文件的方式-----------------------------------------------------------------------------

         NSString* userName = [defaul objectForKey:@"userName"];

         NSString* pwd = [defaul objectForKey:@"password"];

         只要是牵扯到key和value的,那么存储的时候key怎么写,取的时候,key必须怎么写

         只要是牵扯到key和value的,那么存储的key如果一样,肯定会发生覆盖

         NSArray* ClassAllInfo = [defaul objectForKey:@"clss_Info"];

         BOOL isok = [defaul objectForKey:@"status"];

         float f1 = [defaul floatForKey:@"float"];

         NSInteger i = [defaul integerForKey:@"int"];

         BOOL b = [defaul boolForKey:@"status"];

         

         NSLog(@"%@ %@",userName,pwd);

        【扩展】-----------------------------------------------------------------------

        1.编程中文件的命名最好不要有中文、空格、特殊符号(因为计算机会对中文或者空格或者特殊符号进行转义)

        2.文件和内存数据之间的转换关系

        cpu(计算机处理数据大脑)所有的数据都是按照cpu的指令去调度执行

        本地文件——>内存           (读的过程)

        内存      ——>本地文件     (写的过程)

       【注】代码中定义的变量或者对象变量,这些变量的内容都是在内存中存储运算。如果想把一些有用的信息永久保留,就需要把信息保存到文件中。

        

      (1)内存中的数据,都是一些临时数据,当计算机发生意外情况(断电),内存中的数据都会消失;

      (2)把内存中的输入写入到文件中,就可以永久保存,只要文件没有被删除。

     */

    #pragma mark 六、Json解析============================================================

    /*

            一、json格式解析

            1.json

            2.xml

            【比较】xml格式出现的比json格式早,xml就是表单(表格)(<body>name</body>),xml最致命的缺点就是可阅读性不高,导致程序员解析比较麻烦。xml优点是应用到大数据量。但是,随着移动端的兴起,json这种格式也开始流行。逐渐成为ios平台和安卓平台app端获取数据一种格式。json格式优点:格式清晰,应用于小数据量的获取。

            

            【注】可以利用http://www.bejson.com/     对json格式进行校验并规整。

            

             协议很多种:http  ftp  mail  file socket xmpp

             url格式:  协议://域名(ip地址):端口/路径 ?参数列表(以&符间隔每个参数)

             

            例:----------------------------------------------------------------------------------------

             #import <Foundation/Foundation.h>

             #import "MyModel.h" //该类中有content/modelId/user(通过UserModel.h创建user,即属于组合关系)属性(成员变量)

             #import "UserModel.h"//该类中有avatar_updataed_at/created_at/last_debice属性(成员变量)

             #define PATH @"http://m2.qiushibaike.com/article/list/latest?page=1&count=30&rqcnt=21&r=a1ef5f561429944164282"

             把字符串类型转成NSURL类型,转换的过程,字符串内容不变

             NSURL *url = [NSURL URLWithString:PATH];

             //initWithContentsOfFile:读本地文件

             //NSData *data1 = [[NSData alloc] initWithContentsOfFile:@""];

             通过url获取数据 NSData:是数据流格式

             NSData *data = [[NSData alloc] initWithContentsOfURL:url];

             NSError *error = nil;

             它(NSJSONSerialization)为苹果系统自带解析,提供的一个解析json数据格式的一个类.

             此方法是把data解析成NSDictionary 操作读取可变内容

             NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

             if (error) {

             NSLog(@"解析失败");

             exit(-1);

             }

             NSArray *array = [dic objectForKey:@"items"];

             创建一个数组,用来存储数据模型

             NSMutableArray *dataArray = [[NSMutableArray alloc] init];

             遍历items 这个节点下的所有数据

             for (int i = 0; i < array.count; i++) {

             创建一个myModel 模型

             ios中把数据赋给一个对象的属性变量,而这个对象的作用就是为了用来装数据的,那么这个类就称为模型类

             MyModel *myModel = [[MyModel alloc] init];

             NSDictionary *dicItem = array[i];

             这里的key一定要对应url返回来字段值

             myModel.content = [dicItem objectForKey:@"content"];

             myModel.modelId = [dicItem objectForKey:@"id"];

             

             isMemberofClass 是用来判断是否属于哪个类的成员

             可以用isMemberofClass:[NSNull class] 来判断是否为空

             if (![[dicItem objectForKey:@"user"] isMemberOfClass:[NSNull class]] ) {

             NSDictionary *userDic = [dicItem objectForKey:@"user"];

             UserModel *userModel = [[UserModel alloc] init];

             userModel.avatar_updated_at = [userDic objectForKey:@"avatar_updated_at"];

             userModel.created_at = [userDic objectForKey:@"created_at"];

             userModel.last_device = [userDic objectForKey:@"last_device"];

             myModel.user = userModel;  //通过组合关系进行赋值,让一个类拥有另外一个类的成员变量

             

             }

             [dataArray addObject:myModel];

             }

             从存放model模型的数组中打印数据信息

             for (MyModel *myModel in dataArray) {

             

             NSLog(@"content:%@,modelId:%@",myModel.content,myModel.modelId);

             UserModel *userModel = myModel.user;

             NSLog(@"更新时间:%@,创建时间:%@,最终设备:%@",userModel.avatar_updated_at,userModel.created_at,userModel.last_device);

             

             }

          }

        

         Json提取信息练习题==================================================================================

         http://www.bejson.com/jshtml_format/

         http://m2.qiushibaike.com/article/list/latest?page=1&count=30&rqcnt=21&r=a1ef5f561429944164282

         //1.分类接口

         http://online.dongting.com/module/rank?page=1&utdid=VPKhKyoz9h4DANpyKlAtL6Pe&size=100

         //2.娱乐接口

         http://api.sina.cn/sinago/list.json?uid=728e4f475f1a4f0b&platfrom_version=4.4.4&wm=b207&oldchwm=14070_0001&imei=866022023783290&from=6045195012&chwm=14070_0001&AndroidID=b370f996b0e79e56efe9fd50afd9646f&v=1&s=20&IMEI=2c5e43d67f6dd74cd776d8f9ea45e181&p=1&user_id=&MAC=4948e119bc077f67bc461d81378c8c0f&channel=news_ent

         //3.旅游折扣

         http://open.qyer.com/lastminute/get_lastminute_list?client_id=qyer_ios&client_secret=cd254439208ab658ddf9&v=1&track_user_id=&track_deviceid=E57D6014-1D9F-437C-B9E5-17CF697370FA&track_app_version=5.4.4&track_app_channel=App%20Store&track_device_info=iPhone7,1&track_os=ios%208.1&lat=40.033568&lon=116.358971&app_installtime=1421832230&page_size=20&is_show_pay=1&country_id=0&continent_id=0&max_id=0&times=&product_type=0

         4.url://娱乐接口 题目要求:请用数据模型存储title、intro、alt

         http://api.sina.cn/sinago/list.json?uid=728e4f475f1a4f0b&platfrom_version=4.4.4&wm=b207&oldchwm=14070_0001&imei=866022023783290&from=6045195012&chwm=14070_0001&AndroidID=b370f996b0e79e56efe9fd50afd9646f&v=1&s=20&IMEI=2c5e43d67f6dd74cd776d8f9ea45e181&p=1&user_id=&MAC=4948e119bc077f67bc461d81378c8c0f&channel=news_ent

         

         

         5.http://online.dongting.com/module/rank?page=1&utdid=VPKhKyoz9h4DANpyKlAtL6Pe&size=100

         取出数据中的_id,name,desc,time; 和singer_name 、song_name;通过模型存入数组中,然后通过写文件的方式写入到根目录下的/lrcInfo/1.txt文件中,如果文件不存在请先创建,如果文件存在,则删除文件拷贝到跟目录中,文件重命名为:2.txt

         

         

        6.取出如下url中的所有数据,写入plist文件

         http://api.sina.cn/sinago/list.json?uid=728e4f475f1a4f0b&platfrom_version=4.4.4&wm=b207&oldchwm=14070_0001&imei=866022023783290&from=6045195012&chwm=14070_0001&AndroidID=b370f996b0e79e56efe9fd50afd9646f&v=1&s=20&IMEI=2c5e43d67f6dd74cd776d8f9ea45e181&p=1&user_id=&MAC=4948e119bc077f67bc461d81378c8c0f&channel=news_ent

         

    */

  • 相关阅读:
    正则表达式-入门初探
    pytorch 对变长序列的处理
    数位DP小结
    impala 使用记录
    2017微软第二场笔试题解
    一次分清:jvm内存结构|jmm|java对象模型
    JMM-java内存模型
    java基础总结
    有关秒杀的一点思考
    Elasticsearch 启动报了TypeError: can’t dup Fixnum 错
  • 原文地址:https://www.cnblogs.com/GJ-ios/p/5323302.html
Copyright © 2011-2022 走看看