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]; }