• 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": "u8282u594fu91cdu590d",
          "releaseDate": "2014-07-01",
          "version": "2.3",
          "description": "u754cu9762u6e05u65b0u7b80u5355u7684u97f3u4e50u8282u594fu6e38u620fu3002u6e38u620fu7684u64cdu4f5cu975eu5e38u7b80u5355uff0cu53eau9700u6839u636eu63d0u793au4f9du6b21u70b9u51fbu76f8u5e94u7684u56feu6807u5373u53efuff0cu5171u6709u4e09u79cdu4e50u66f2u9009u62e9u3002",
          "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即可以在需要显示图片时进行加载

    四、总结

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

  • 相关阅读:
    hdu 2492 树状数组 Ping pong
    HDU 1532 基础EK Drainage Ditches
    EK算法模板
    Codeforces Round #538 (Div. 2) (A-E题解)
    Codeforces Global Round 1 (A-E题解)
    Educational Codeforces Round 59 (Rated for Div. 2) DE题解
    Codeforces Round #535 (Div. 3) 题解
    Codeforces Round #534 (Div. 2) D. Game with modulo(取余性质+二分)
    POJ2253:Frogger(改造Dijkstra)
    POJ1797:Heavy Transportation(改造Dijkstra)
  • 原文地址:https://www.cnblogs.com/sdaman/p/IOS.html
Copyright © 2020-2023  润新知