IOS之网络数据下载和JSON解析
简介
在IOS中的开发中,应用类型大体可分为两类,一是本地应用,一般利用本地数据加载内容,二是网络应用,利用服务端的传送来的数据经过解析后加载内容,下文将介绍网络应用开发的基础知识。将涉及下面几点知识:
1.利用NSURL等类进行数据下载;
2.JSON的数据格式和JSON解析;
3.利用第三方库SDWebImage显示图片。
一、NSURL类
1、NSURL相关类介绍
(1)NSURL:请求地址
(2)NSURLRequest:封装一个请求地址,保存发给服务器的全部数据
(3)NSMutableURLRequest:NSURLRequest的子类
(4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据
2、NSURL相关类使用
(1)创建一个NSURL对象,设置请求路径(设置请求路径)
(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)
(3)使用NSURLConnection发送NSURLRequest(发送请求)
3、使用相关
利用NSURL可以建立同步请求或者异步请求,同步请求会使应用一直处于等待服务器返回数据状态,如果服务器,没有返回数据,那么在主线程UI会卡住不能继续执行操作,进入所谓的假死,异步请求则可以避免这种情况;
(1)同步请求
重申一下发送请求的步骤
1.设置请求路径
2.创建请求对象
NSString *urlString = @"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id="; //发送同步URL请求 //NSURLRequest 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 = %@",str); } else { NSLog(@"下载失败"); }
此处 http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id= 为网络接口,通过该网络接口生成请求和建立连接
(2)异步请求
异步请求的实现方法有两种,一是利用代码块Block的回调,二是利用代理协议,此处只简单介绍代码块的回调使用
代码块Block的异步请求:
示例代码
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://iappfree.candou.com:8080/free/applications/limited?currency=rmb&page=1&category_id="]]; NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //获取主线程 [NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { }];
利用 sendAsynchronousRequest: queue: completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {} 方法发送异步请求,代码块的内容一般是解析下载的数据然后刷新UI界面,因为UI界面的刷新一定要在主线程中完成,所以创建了主操作队列进行刷新;
代理协议异步请求:
示例代码
-(void)testNSURLConnectionAsyncDownloadData { 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); } -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"error = %@",error); }
建立连接前需要遵守NSURLConnectionDataDelegate协议,NSURL相关类的使用简单,按照指定步骤进行即可。
二、JSON相关
1、JSON基本知识
服务器返回给应用的数据一般有两种格式,一是JSON格式,二是XML格式,此处将介绍JSON格式。
JSON的数据格式相当简洁轻量,因而易于解析,下面是一段JSON的示例代码
{
"applications": [
{
"applicationId": "455680974",
"slug": "rhythm-repeat",
"name": "u8282u594fu91cdu590d",
"releaseDate": "2014-07-01",
"version": "2.3",
"description": "u754cu9762u6e05u65b0u7b80u5355u7684u97f3u4e50u8282u594fu6e38u620fu3002u6e38u620fu7684u64cdu4f5cu975eu5e38u7b80u5355uff0cu53eau9700u6839u636eu63d0u793au4f9du6b21u70b9u51fbu76f8u5e94u7684u56feu6807u5373u53efuff0cu5171u6709u4e09u79cdu4e50u66f2u9009u62e9u3002",
"categoryId": 6014,
"categoryName": "Game",
"iconUrl": "http://photo.candou.com/i/114/55b07f3725eae8b3cafc9bce10d16e46",
"itunesUrl": "http://itunes.apple.com/cn/app/rhythm-repeat/id455680974?mt=8",
"starCurrent": "4.0",
"starOverall": "4.0",
"ratingOverall": "0",
"downloads": "3217",
"currentPrice": "0",
"lastPrice": "12",
"priceTrend": "limited",
"expireDatetime": "2015-04-06 01:50:41.0",
"releaseNotes": "Multi-Touch bug fixed",
"updateDate": "2014-10-17 15:45:27",
"fileSize": "16.69",
"ipa": "1",
"shares": "390",
"favorites": "273"
},
解析JSON就要把JSON 转换为 OC数据类型
大括号{}对应OC中的NSDictionary,中括号[]对应OC中的NSArray,“”双引号对应OC中的NSString,6014对应OC中的NSNumber
2、JSON解析
在iOS中,JSON的常见解析方案有多种:
(1)第三方框架:JSONKit、SBJson、TouchJSON
(2)苹果原生(自带):NSJSONSerialization
下面介绍NSJSONSerialization的使用
NSJSONSerialization的常见方法
(1)JSON数据 ——》 OC对象
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
JSON数据的外部为{}时,返回类型设置为NSDictionary,为[]时,返回类型为NSArray;
其中data为从服务器接受的数据;
(2)OC对象 ——》 JSON数据
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
示例代码
- (void)dealDownLoad:(MyHttpRequest *)request{ NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.data options:NSJSONReadingMutableContainers error:nil]; NSArray *arrTemp = dict[@"applications"]; [_dataArray removeAllObjects]; for (NSDictionary *dicTemp in arrTemp) { AppDataModel *modal = [[AppDataModel alloc] init]; modal.applicationID = dicTemp[@"applicationId"]; modal.iconUrl = dicTemp[@"iconUrl"]; modal.name = dicTemp[@"name"]; [_dataArray addObject:modal]; } [_tableView reloadData]; }
JSON的解析简单,此处不多赘述了
三、SDWebImage使用
第三库SDWebImage不支持ARC,所以使用前需要进行配置,给库内的所有文件设置-fno-objc-arc,如图所示
利用库内的方法setImageWithURL,传入一个图片URl即可以在需要显示图片时进行加载
四、总结
本文涉及的知识不算难懂,多练习就好了,另外本人目前水平有限,如有错误之处,还请各位在下面评论指出,谢谢!