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的使用)

效果图:

原文地址:https://www.cnblogs.com/monian0313/p/4384498.html