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的使用)
效果图:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。