网络数据下载和JSON解析

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

简介

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

  涉及到的知识点有:

  1.NSURLConnection异步下载和封装

  2.JSON格式和JSON格式解析

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

内容

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

  什么是网络应用?

    对于iOS开发来说的网络应用,笔者觉得需要通过访问网络,获取服务端数据来实现全部功能的的iOS应用程序都可以成为网络应用。

  网络应用的程序结构

    网络应用程序的结构有B/S浏览器/服务器 , C/S客户端浏览器。C/S结构相对而言有更快的响应速度,因为他减少了必要的数据的传输,而且处理更多计算或逻辑处理。

 

  常见的网络接口形式

    iOS网络应用常见的数据接口一半都是HTTP形式的URL地址, 例如爱限免应用首页的数据地址为http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=

在项目中一般使用一些开源库通过这种网址下载数据. 例如AFNetworking

    

  常见的数据格式

    常见的网络接口形式有XML,Json,我们现在讨论Json格式,在其他博文中会设计到 XML。

2.NSURLConnection使用

  我们可以很方便的通过创建URL,  通过URL 创建链接来访问网络。下面提供几种获取网络数据的方法。

    // HTTP中使用URL地址
    //  http:// 地址使用协议(ftp://)
    //  iappfree.candou.com  主机地址(域名和IP)
    //  :8080                   主机端口
    //  /free/applications/limited  网页程序文件路径
    //  ?currency=rmb&page=1&category_id= 程序参数(参数用&分割)

 

  (1) 通过URL同步获取数据

-(void)testNSStringDownloadData{
    
    NSURL *url = [NSURL URLWithString:@"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=%d&category_id="];
    NSLog(@"%@",url);
    
    NSError * error = nil;
    NSString *content = [[NSString alloc]initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    
    if (error == nil) {
        NSLog(@"%@",content);
        
    }else{
    
        NSLog(@"下载失败");
    }
}

  (2)通过NSURLConnection同步下载

-(void)testNSURLConectionSynDownloadData{
    NSString *str = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";
    
    NSURL * url = [NSURL URLWithString:str];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    if (error == nil) {
        NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"str = %@",string);
    }else{
        NSLog(@"failed");
    }
}

  (3)更好的方式是通过NSURLConnection异步加载,在

NSURLConnectionDataDelegate代理方法中实现数据下载完成的操作。
@interface NLViewController () <NSURLConnectionDataDelegate>
{
    NSURLConnection * _connection;
    NSMutableData * _data;
}

@end

@implementation NLViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //1. load data
    [self testNSURLConectionAsynDownloadData];
    
}

-(void)testNSURLConectionAsynDownloadData{
    NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id=";
    _data = [[NSMutableData alloc]init];
    
    //利用URL字符串初始化一个URL对象
    NSURL *url = [NSURL URLWithString:urlString];
    //使用URL创建一个NSURLRequest对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 初始化一个NSURLConnection对象,并立即开始访问数据,处理相应的代理方法。
    _connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
}


#pragma mark - 代理方法
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"didReceiveResponse");
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [_data appendData:data];
    NSLog(@"didReceiveData");
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"connectionDidFinishLoading");
    NSString *str = [[NSString alloc]initWithData:_data encoding:NSUTF8StringEncoding];
    NSLog(@"str = %@",str);
    
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"dict = %@",dict);
    
    NSArray * dicts = [dict valueForKeyPath:@"applications"];
    for (NSDictionary *dict in dicts) {
        NSLog(@"name = %@",dict[@"name"]);
    }
}

 

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

JSON建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

 

4.Json解析

  可以通过系统提供的一个类NSJSONSerialization来完成,可以很方便的转为字典或者数组。范例代码如下。

- (void)dealDownloadFinish:(NLHttpRequest *)request{
    
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.data options:NSJSONReadingMutableContainers error:nil];
    
    NSArray * dicts = [dict valueForKeyPath:@"list"];
    for (NSDictionary *dict in dicts) {
        NLEvent *event = [NLEvent eventWithDictionary:dict];
        [_modelArray addObject:event];
    }
    [_tableView reloadData];
}

 

posted @ 2015-04-07 02:00  wantyoulee  阅读(481)  评论(0编辑  收藏  举报