Fork me on GitHub

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(@"%@\n%@\n%@\n",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

     

*/

posted @ 2016-03-26 16:47  极度恐慌_JG  阅读(1685)  评论(0编辑  收藏  举报