IOS之网络数据下载和JSON解析

IOS之网络数据下载和JSON解析

简介

   在IOS中的开发中,应用类型大体可分为两类,一是本地应用,一般利用本地数据加载内容,二是网络应用,利用服务端的传送来的数据经过解析后加载内容,下文将介绍网络应用开发的基础知识。将涉及下面几点知识:

   1.利用NSURL等类进行数据下载;

   2.JSON的数据格式和JSON解析;

   3.利用第三方库SDWebImage显示图片。

一、NSURL类

   1、NSURL相关类介绍

  (1)NSURL:请求地址

  (2)NSURLRequest:封装一个请求地址,保存发给服务器的全部数据

  (3)NSMutableURLRequest:NSURLRequest的子类

  (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据

   2、NSURL相关类使用

  (1)创建一个NSURL对象,设置请求路径(设置请求路径)

  (2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)

  (3)使用NSURLConnection发送NSURLRequest(发送请求)

  3、使用相关

   利用NSURL可以建立同步请求或者异步请求,同步请求会使应用一直处于等待服务器返回数据状态,如果服务器,没有返回数据,那么在主线程UI会卡住不能继续执行操作,进入所谓的假死,异步请求则可以避免这种情况;

    (1)同步请求

    重申一下发送请求的步骤

      1.设置请求路径

      2.创建请求对象

      3.发送请求
    下面是示例代码
NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";
    
    //发送同步URL请求
    //NSURLRequest URL请求对象
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    if(error == nil)
    {
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"str = %@",str);
    }
    else
    {
        NSLog(@"下载失败");
    }

     此处 http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id= 为网络接口,通过该网络接口生成请求和建立连接

   (2)异步请求

     异步请求的实现方法有两种,一是利用代码块Block的回调,二是利用代理协议,此处只简单介绍代码块的回调使用

     代码块Block的异步请求:

     示例代码

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id="]];
    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
//获取主线程
    [NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
    }];

    利用 sendAsynchronousRequest: queue: completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {} 方法发送异步请求,代码块的内容一般是解析下载的数据然后刷新UI界面,因为UI界面的刷新一定要在主线程中完成,所以创建了主操作队列进行刷新;

            代理协议异步请求:

    示例代码

-(void)testNSURLConnectionAsyncDownloadData
{
    NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";
    
    //初始化
    _data = [[NSMutableData alloc] init];
    //发起了一个异步的URL连接请求
    //异步:   执行了方法之后开始下载,立即返回
    //              下载过程在后台(多线程)执行
    _connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] delegate:self startImmediately:YES];
    NSLog(@"initWithRequest 执行完成");
    
}
//代理方法: 接收到服务器响应执行
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"接收到服务器响应执行");
}
//代理方法: 接收到数据的时候执行
//注意: 当数据比较大, 可能多次执行
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    
    [_data appendData:data];
}
//代理方法: 数据下载完成了
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *str = [[NSString alloc] initWithData:_data encoding:NSUTF8StringEncoding];
    NSLog(@"str = %@",str); 
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"error = %@",error);
}

    建立连接前需要遵守NSURLConnectionDataDelegate协议,NSURL相关类的使用简单,按照指定步骤进行即可。

二、JSON相关

1、JSON基本知识

   服务器返回给应用的数据一般有两种格式,一是JSON格式,二是XML格式,此处将介绍JSON格式。

   JSON的数据格式相当简洁轻量,因而易于解析,下面是一段JSON的示例代码

  

{
  "applications": [
    {
      "applicationId": "455680974",
      "slug": "rhythm-repeat",
      "name": "\u8282\u594f\u91cd\u590d",
      "releaseDate": "2014-07-01",
      "version": "2.3",
      "description": "\u754c\u9762\u6e05\u65b0\u7b80\u5355\u7684\u97f3\u4e50\u8282\u594f\u6e38\u620f\u3002\u6e38\u620f\u7684\u64cd\u4f5c\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u6839\u636e\u63d0\u793a\u4f9d\u6b21\u70b9\u51fb\u76f8\u5e94\u7684\u56fe\u6807\u5373\u53ef\uff0c\u5171\u6709\u4e09\u79cd\u4e50\u66f2\u9009\u62e9\u3002",
      "categoryId": 6014,
      "categoryName": "Game",
      "iconUrl": "http:\/\/photo.candou.com\/i\/114\/55b07f3725eae8b3cafc9bce10d16e46",
      "itunesUrl": "http:\/\/itunes.apple.com\/cn\/app\/rhythm-repeat\/id455680974?mt=8",
      "starCurrent": "4.0",
      "starOverall": "4.0",
      "ratingOverall": "0",
      "downloads": "3217",
      "currentPrice": "0",
      "lastPrice": "12",
      "priceTrend": "limited",
      "expireDatetime": "2015-04-06 01:50:41.0",
      "releaseNotes": "Multi-Touch bug fixed",
      "updateDate": "2014-10-17 15:45:27",
      "fileSize": "16.69",
      "ipa": "1",
      "shares": "390",
      "favorites": "273"
    },

  解析JSON就要把JSON 转换为 OC数据类型

    大括号{}对应OC中的NSDictionary,中括号[]对应OC中的NSArray,“”双引号对应OC中的NSString,6014对应OC中的NSNumber

2、JSON解析

  在iOS中,JSON的常见解析方案有多种:

  (1)第三方框架:JSONKit、SBJson、TouchJSON

  (2)苹果原生(自带):NSJSONSerialization

   下面介绍NSJSONSerialization的使用

    NSJSONSerialization的常见方法

    (1)JSON数据 ——》 OC对象

      + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

     JSON数据的外部为{}时,返回类型设置为NSDictionary,为[]时,返回类型为NSArray;

     其中data为从服务器接受的数据;

    (2)OC对象 ——》 JSON数据 

      + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

     示例代码

- (void)dealDownLoad:(MyHttpRequest *)request{
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.data options:NSJSONReadingMutableContainers error:nil];
    NSArray *arrTemp = dict[@"applications"];
    [_dataArray removeAllObjects];
    for (NSDictionary *dicTemp in arrTemp) {
        AppDataModel *modal = [[AppDataModel alloc] init];
        modal.applicationID = dicTemp[@"applicationId"];
        modal.iconUrl = dicTemp[@"iconUrl"];
        modal.name = dicTemp[@"name"];
        [_dataArray addObject:modal];
    }
    [_tableView reloadData];
}

    JSON的解析简单,此处不多赘述了

三、SDWebImage使用 

  第三库SDWebImage不支持ARC,所以使用前需要进行配置,给库内的所有文件设置-fno-objc-arc,如图所示技术分享

   利用库内的方法setImageWithURL,传入一个图片URl即可以在需要显示图片时进行加载

四、总结

  本文涉及的知识不算难懂,多练习就好了,另外本人目前水平有限,如有错误之处,还请各位在下面评论指出,谢谢!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。