IOS开发中网络编程应用场景:JSON数据获取,网络数据的下载。
一:请求JSON数据一般用异步请求的方式,如果用同步请求,则会造成IOS界面的执行过程阻塞,即界面部分在请求数据的过程中必须等待数据加载完毕。
JSON数据的获取步骤:
1.设置网络地址的字符串:NSString *URLString = @"http://www.baidu.com";
2.创建URL:NSURL *URL = [NSURL URLWithString:URLString];
3.创建请求:NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];
4.发送异步请求:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:URLRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//发送请求完成后的回调Block,用于处理请求到得数据 data
/*
此处完成JSON解析data的过程
*/
}];
若发送同步请求:
NSURLResponse *returnResponse; //保存反馈信息
NSError *error; //保存错误信息
NSData *data = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:&returnResponse error:&error];
JSON解析data,或查看错误信息,或查看连接反馈信息。
二:网络数据的断点续传的下载
断点续传的步骤:
1.设置下载文件在网络服务器的地址:NSString *fileURL = @"http://www.baidu.com"; //以百度网址为例子
2.设置本地保存下载文件的地址:NSString *fileSavePath = @"/Users/apple/Downloads/1.temp"; //以mac上下载文件夹的路径为例
3.实现 开始下载 函数
- (void)startDownLoad
{
#=======================实现断点续传的关键 Start===========================
//设置文件下载的开始位置,以字节数为计算单位,默认从0开始。
unsigned long long startBytes = 0;
//判断文件是否存在,得到整个下载文件的断点字节数的位置
if ([[NSFileManager defaultManager] fileExistsAtPath:_filePath])
{
startBytes = [[NSData dataWithContentsOfFile:_filePath] length];
}
else
{
[[NSFileManager defaultManager] createFileAtPath:_filePath contents:nil attributes:nil];
}
//创建可变的URLRequest,无视缓存,请求超时为10秒
NSMutableURLRequest *mutableRequest=[NSMutableURLRequest requestWithURL:fileURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0f ];
//设置请求Head,设置文件传输的起始字节位置
NSString *rangeValue = [NSString stringWithFormat:@"bytes=%llu-",startBytes]; //这里注意字符串的格式必须正确,一个字符也不能少。
[mutableRequest addValue:rangeValue forHTTPHeaderField:@"Range"]; //字符串的值必须是@"Range"。
#======================实现断点续传的关键 End=========================
//建立连接
NSURLConnection = [NSURLConnection connectionWithRequest:mutableRequest delegate:self]; //此方法一旦建立成功,则直接启动下载
(人为控制启动下载
connection = [[NSURLConnection alloc] initWithRequest:mutableRequest delegate:self startImmediately:NO];
[connection start ];)
}
4.中断下载
- (void)pauseDownLoad
{
//取消连接操作
[connection cancel];
connection = nil;
//关闭文件操作
[outHandle closeFile];
outHandle = nil;
}
#====================下载代理<NSURLConnectionDataDelegate>的实现=========
//开始下载数据之前执行。
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//开启文件,开始写入数据
_outHandle = [NSFileHandle fileHandleForWritingAtPath:_filePath];
//获取下载的一些信息
[response expectedContentLength]; //整个下载文件的大小
[response MIMEType]; //下载文件的类型
[response textEncodingName]; //下载的内容字符编码名称
[response suggestedFilename]; //下载的文件的默认名称
}
//收到数据时执行的代码,此方法在下载过程中可能执行多次。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//写入文件操作
[_outHandle seekToEndOfFile];
[_outHandle writeData:data];
//或者用可变的data类型接收数据
[mutableData appedData:data];
}
//数据加载完成后执行善后操作
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"下载完成!");
[_outHandle closeFile];
_outHandle = nil;
}
//下载出错的情况下执行
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[_outHandle closeFile];
_outHandle = nil;
NSLog(@"connection on Error:%@",error);
}
总结:这只是描述有关断点续传的基本实现,如果要添加进度条或者多文件队列的下载实现的话,需要进一步封装下载功能,形成一个方便使用的库。
关于库的研究下次再讨论。