zoukankan      html  css  js  c++  java
  • iOS开发网络篇—数据的解析

    网络上传输数据通用的有XML,JSON等,iOS中也可以用Plist。

    要进行数据传输,就要首先进行序列化:

    1.序列化.
     对象转换成二进制流.(这个一句话就行)
    2.反序列化.
    二进制流转换为对象等. (关键要弄清楚这个)
     
    JSON:(和XML一样都是用来传数据的)
    轻量级的数据交换格式,正在逐步取代XML.
    XML:
    结构性的标记语言,易读.但数据量大.
    Plist偶尔用着玩玩:
    Mac、iOS中用的多一种格式。
     
    一、应用场景
    1、XML的应用场景:
    XMPP——即时通讯,KissXML
    RSS目前还有少量的企业在使用
    开源的WebServices,例如天气预报等
    如果设计好XML的接口,XML的解析并不会太复杂
     
    2、JSON的应用场景:(数据量小,轻量级)
    移动开发中绝大多数还是使用JSON
    如果自己开发,或者公司后台接口,最好使用JSON.
     
    二、Plist解析数据
    定义一个Plist的格式如下:
     
    解析代码如下:(在异步线程中进行, 最后得到array)
    [objc] view plaincopy
     
    1. - (void)loadData  
    2. {  
    3.     // 1. url  
    4.     NSURL *url = [NSURL URLWithString:@"http://localhost/videos.plist"];  
    5.       
    6.     // 2. request  
    7.     // timeoutInterval 如果5.0之内没有从服务器返回结果,就认为超时了  
    8.     /** 
    9.      NSURLRequestUseProtocolCachePolicy = 0,            // 使用协议缓存策略(默认) 
    10.      NSURLRequestReloadIgnoringLocalCacheData = 1,      // 忽略本地缓存数据(断点续传时使用) 
    11.      NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, == 1 
    12.       
    13.      // 以下少用 
    14.      NSURLRequestReturnCacheDataElseLoad = 2,           // 如果有缓存,就返回缓存数据,否则加载 
    15.      NSURLRequestReturnCacheDataDontLoad = 3,           // 死活不加载远程服务器数据,如果用户没有网络连接时可以使用 
    16.       
    17.      // 以下没有实现 
    18.      NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // 没有实现 
    19.      NSURLRequestReloadRevalidatingCacheData = 5, // 没有实现 
    20.      */  
    21.     NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:5.0];  
    22.       
    23.     // 3. 网络异步请求  
    24.     [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {  
    25.           
    26.         if (connectionError) {  
    27.             NSLog(@"错误 %@", connectionError);  
    28.             return;  
    29.         }  
    30.           
    31.         // data是一个plist数据, 对data进行反序列化,解析  
    32.         NSArray *array = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];  
    33.           
    34.         // 刷新数据,在UI线程中更新UI  
    35.         dispatch_async(dispatch_get_main_queue(), ^{  
    36.             //.....  
    37.         });  
    38.     }];  
    39. }  

    三、XML解析
    iOS中XML解析方式的两种方式(Android中好友pull等) :
    1、SAX(SimpleAPI for XML)
    只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
    常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
    从文档的开始通过每一节点移动,定位一个特定的节点
    2、DOM(DocumentObject Model)
    不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档.方便操作.
    在内存中生成节点树操作代价昂贵
     
    XML解析步骤:
    1、实例化NSXMLParser,传入从服务器接收的XML数据
    2、定义解析器代理
    3、解析器解析,通过解析代理方法完成XML数据的解析。
     
    解析XML用到的的代理方法:

    1. 开始解析XML文档

    - (void)parserDidStartDocument:

    2. 开始解析某个元素,会遍历整个XML,识别元素节点名称,如<video>开头

    -(void)parser:didStartElement:namespaceURI:qualifiedName:attributes:

    3. 文本节点,得到文本节点里存储的信息数据。 节点中的数据<video>XXXX</video>

    - (void)parser:foundCharacters:

    4. 结束某个节点  如</video>开头

    - (void)parser:didEndElement:namespaceURI:qualifiedName:

    注意:在解析过程中,2、3、4三个方法会不停的重复执行,直到遍历完成为止

    5.解析XML文档结束

    - (void)parserDidEndDocument:

    6.解析出错

    -(void)parser:parseErrorOccurred:
     
    注意: 从网络上加装数据是不能用懒加载的.
    XML文件格式如下
    [html] view plaincopy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <videos>  
    3.     <video videoId="1">  
    4.         <name>苍老师1</name>  
    5.         <length>320</length>  
    6.         <videoURL>/苍老师1.mp4</videoURL>  
    7.         <imageURL>/苍老师1.png</imageURL>  
    8.         <desc>学iOS找苍老师1</desc>  
    9.         <teacher>苍老师111</teacher>  
    10.     </video>  
    11.   
    12.     <video videoId="2">  
    13.         <name>苍老师2</name>  
    14.         <length>2708</length>  
    15.         <videoURL>/苍老师2.mp4</videoURL>  
    16.         <imageURL>/苍老师2.png</imageURL>  
    17.         <desc>学iOS找苍老师2</desc>  
    18.         <teacher>苍老师222</teacher>  
    19.     </video>  
    20. </videos>  
    解析代码如下
    [objc] view plaincopy
     
    1. /** 加载数据 */  
    2. - (void)loadData  
    3. {  
    4.     // 1. url确定资源  
    5.     NSURL *url = [NSURL URLWithString:@"http://localhost/videos.xml"];  
    6.       
    7.     // 2. request建立请求  
    8.     NSURLRequest *request = [NSURLRequest requestWithURL:url];  
    9.       
    10.     // 3. 发送异步请求,新建数据处理队列,待数据处理完成后,再更新UI  
    11.     [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {  
    12.           
    13.         // 1> 实例化XML解析器  
    14.         NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];  
    15.           
    16.         // 2> 设置解析器的代理  
    17.         parser.delegate = self;  
    18.           
    19.         // 3> 开始解析  
    20.         [parser parse];  
    21.     }];  
    22. }  
    23.   
    24. #pragma mark - XML解析代理方法  
    25. // 1. 开始解析文档  
    26. - (void)parserDidStartDocument:(NSXMLParser *)parser  
    27. {  
    28.     // 为了避免重复刷新数据,可以清空数组  
    29.     [self.videoList removeAllObjects];  
    30. }  
    31.   
    32. // 2,3,4三个方法会循环被调用  
    33. // 2. 开始一个元素(节点)<xxx>  
    34. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict  
    35. {  
    36.     if ([elementName isEqualToString:@"video"]) {  
    37.         // 创建新的video对象  
    38.         self.currentVideo = [[Video alloc] init];  
    39.           
    40.         // 使用KVC赋值  
    41.         [self.currentVideo setValue:attributeDict[@"videoId"] forKeyPath:@"videoId"];  
    42.     }  
    43.       
    44.     // 在开始第3个方法前,清空字符串内容  
    45.     [self.elementM setString:@""];  
    46. }  
    47.   
    48. // 3. 发现字符(节点中间内容)  
    49. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string  
    50. {  
    51.     [self.elementM appendString:string];  
    52. }  
    53.   
    54. // 4. 结束节点</xxx>  
    55. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName  
    56. {  
    57.     if ([elementName isEqualToString:@"video"]) {  
    58.         // 将当前正在解析的节点添加到数组  
    59.         [self.videoList addObject:self.currentVideo];  
    60.     } else if (![elementName isEqualToString:@"videos"]) {  
    61.         [self.currentVideo setValue:self.elementM forKeyPath:elementName];  
    62.     }  
    63. }  
    64.   
    65. // 5. 结束文档解析  
    66. - (void)parserDidEndDocument:(NSXMLParser *)parser  
    67. {  
    68.     NSLog(@"结束文档解析 %@", self.videoList);  
    69.     NSLog(@"%@", [NSThread currentThread]);  
    70.     dispatch_async(dispatch_get_main_queue(), ^{  
    71.         //UI线程中刷新UI......  
    72.     });  
    73. }  
    74.   
    75. // 6. 在处理网络数据时,千万不要忘记出错处理  
    76. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError  
    77. {  
    78.     NSLog(@"错误 %@", parseError);  
    79. }  

    四、JSON解析
    解析出来的数据需要进行反序列化,方法如下:
    [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
    JSON解析方便、且轻量级,特别对于手机端,节省流量,快。
    JSON格式数据如下:
    [javascript] view plaincopy
     
    1. [  
    2.     {"videoId":"1",  
    3.     "name":"苍老师1",  
    4.     "length":"320",  
    5.     "videoURL":"/苍老师1.mp4",  
    6.     "imageURL":"/苍老师1.png",  
    7.     "desc":"学iOS找苍老师1",  
    8.     "teacher":"苍老师111"},  
    9.   
    10.     {"videoId":"2",  
    11.     "name":"苍老师2",  
    12.     "length":"2708",  
    13.     "videoURL":"/苍老师2.mp4",  
    14.     "imageURL":"/苍老师2.png",  
    15.     "desc":"学iOS找苍老师2",  
    16.     "teacher":"苍老师222"  
    17.     }  
    18. ]  
    解析代码如下:
    [objc] view plaincopy
     
    1. - (void)loadData  
    2. {  
    3.     // 1. url  
    4.     NSURL *url = [NSURL URLWithString:@"http://localhost/videos.json"];  
    5.       
    6.     // 2. request  
    7.     NSURLRequest *request = [NSURLRequest requestWithURL:url];  
    8.       
    9.     // 3. 发送异步请求  
    10.     [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {  
    11.           
    12.         // data是一个json数据  
    13.         // 对data进行反序列化,解析  
    14.         NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];  
    15.           
    16.         // 刷新数据,更新UI  
    17.         dispatch_async(dispatch_get_main_queue(), ^{  
    18.             //在主线程中更新UI......  
    19.         });  
    20.     }];  
    21. }  
     

    转载请注明出处:http://blog.csdn.net/xn4545945  
  • 相关阅读:
    MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)
    MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
    MySql cmd下的学习笔记 —— 有关视图的操作(建立表)
    MySql cmd下的学习笔记 —— 有关常用函数的介绍(数学函数,聚合函数等等)
    MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
    MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
    MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)
    MySql cmd下的学习笔记 —— 有关select的操作(order by,limit)
    剑指Offer--第21题 调整数组顺序使奇数位于偶数前面;
    剑指Offer--和为s的连续正数序列
  • 原文地址:https://www.cnblogs.com/iosblogx/p/4474627.html
Copyright © 2011-2022 走看看