zoukankan      html  css  js  c++  java
  • iOS之网络数据下载和JSON解析

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

    简介

      在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection从网络上下载数据,以及如何解析下载下来的JSON格式,以及如何显示数据和图片的异步下载显示。

      涉及到的知识点:

      1.NSURLConnection异步下载和封装

      2.JSON格式和JSON格式解析

      3.数据显示和使用SDWebImage异步显示图片

    内容

    1.网络下载基础知识介绍

      什么是网络应用?

        一般情况下,应用都需要加载数据,而所有需要网络加载数据的应用都可以称为网络应用

      网络应用的程序结构

        

      常见的网络接口形式

      常见的数据格式

      界面开发的一般流程

    2.NSURLConnection使用

      NSString同步下载数据

        //HTTP中使用的URL地址
        // http:// 地址使用的协议
        // iappfree.candou.com 主机地址(域名和IP)
        // :8080  主机端口
        // free/applications/limited  网页程序文件路径
        // ?currency=rmb&page=1&category_id= 程序参数(参数用&分割)
        NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";
        // 下载数据
        // 通过地址生产NSURL对象
        NSError *error = nil;
        NSURL *url = [NSURL URLWithString:urlString];
        NSString *content = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (error == nil) {
            NSLog(@"connent = %@",content);
        }
        else
        {
            NSLog(@"下载失败");
        }
    #pragma mark - 异步下载
    - (void)testNSStringAsyncDownloadData
    {
        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);
        
        //解析JSON
        //作用:JSON数据转化为NSArray 或 NSDictionary
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
    //    NSLog(@"%@",dict);
        NSArray *appList = dict[@"applications"];
        for (NSDictionary *appDict in appList) {
            NSLog(@"name = %@",appDict[@"name"]);
        }
        
    }
    //下载失败调用
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
        NSLog(@"error = %@",error);
    }
    
    //  NSURLConnection同步下载
    - (void)testNSStringSyncDownloadData
    {
        NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";
        // 发送同步URL请求
        // NSURLResponse 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);
        }
        else
        {
            NSLog(@"下载失败");
        }
    }
    
    // 同步下载
    - (void)testNSStringDownloadData
    {
        //HTTP中使用的URL地址
        // http:// 地址使用的协议
        // iappfree.candou.com 主机地址(域名和IP)
        // :8080  主机端口
        // free/applications/limited  网页程序文件路径
        // ?currency=rmb&page=1&category_id= 程序参数(参数用&分割)
        NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";
        // 下载数据
        // 通过地址生产NSURL对象
        NSError *error = nil;
        NSURL *url = [NSURL URLWithString:urlString];
        NSString *content = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (error == nil) {
            NSLog(@"connent = %@",content);
        }
        else
        {
            NSLog(@"下载失败");
        }
    }

    由于下载程序经常使用,可以将其封装起来,以便调用。以下是封装了下载程序块:

    #import "ZYHttpRequest.h"
    
    //消除performSelector的警告
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    
    // 类扩张
    // 项目实践:
    //  有些实力变量内部使用,不想放在头文件中,放在这(.m文件)
    
    @interface ZYHttpRequest ()<NSURLConnectionDataDelegate>
    {
        NSURLConnection *_connetion;
        NSString *_url;
        id _target;
        SEL _action;
    }
    @end
    
    @implementation ZYHttpRequest
    //作用:传入网址,下载完成后执行target对象中action方法
    - (void)requestWithUrl:(NSString *)url
                    target:(id)target
                    action:(SEL)action
    {
        _url = url;
        _target = target;
        _action = action;
        
        //发起URL请求  异步请求
        _data = [[NSMutableData alloc] init];
        _connetion = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]] delegate:self startImmediately:YES];
    
    }
    //代理方法:接收到数据的时候执行
    //注意:当数据比较大,可能多次执行
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        [_data appendData:data];
    }
    //代理方法:数据下载完成调用
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        //下载完成后,执行保存的方法
        if (_target && [_target respondsToSelector:_action]) {
            [_target performSelector:_action withObject:self];
        }
    }
    @end

    3.JSON格式说明和格式化工具

         // JSON

         // JavaScript Object Notation

         // [] 表示数组,对应NSArray

         // ,  表示并列的数据

         // {} 表示字典,对应NSDictionary

         // "ta" 表示字符串,对应NSString

         // 20  对应NSNumber

        //解析JSON
        //作用:JSON数据转化为NSArray 或 NSDictionary
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
    //    NSLog(@"%@",dict);
        NSArray *appList = dict[@"applications"];
        for (NSDictionary *appDict in appList) {
            NSLog(@"name = %@",appDict[@"name"]);

    4.一个完整的页面的实现(包含model的创建,SDWebImage的使用)

    效果图:

  • 相关阅读:
    [导入]流失
    [导入]喜欢与爱
    [导入]毕业的大学生的100条忠告
    sql 实现从右边查询制定字符出现的位置
    [导入]毕业了
    gridview 实现多字段综合查询
    Java实现图片添加水印文字(左右下角)
    python安装win32api pywin32 后出现 ImportError: DLL load failed
    Asp.net mvc 速度优化 关注Yslow(1)
    WPF 3D中如何选择模型的一部分并维护模型
  • 原文地址:https://www.cnblogs.com/monian0313/p/4384498.html
Copyright © 2011-2022 走看看