IOS开发之网络编程(请求数据和断点续传)

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);

}

总结:这只是描述有关断点续传的基本实现,如果要添加进度条或者多文件队列的下载实现的话,需要进一步封装下载功能,形成一个方便使用的库。

关于库的研究下次再讨论。

时间: 2024-10-21 06:54:36

IOS开发之网络编程(请求数据和断点续传)的相关文章

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDataDelegate一起搭配实现文件上传功能.另外,下面使用的文件上传思路是和NSURLConnection中本人之前的随笔<iOS开发之网络编程--使用NSURLConnection实现文件上传>提到的上传思路是一样的,都是要将请求信息拼接起来,然后传入到请求里进行上传.这个拼接过程是必要的,但

iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载

本文内容大纲: 1.回顾NSURLSessionTask 2.NSURLSessionDownloadTask大文件之block下载 3.NSURLSessionDownloadTask大文件之代理方法下载 4.NSURLSessionDownloadTask大文件之代理方法实现断点续传下载 前言:如果读者是第一次阅读或者是学习关于本篇要介绍的NSURLSession的知识,最好先阅读本人前篇<iOS开发之网络编程--1.NSURLSession的基本使用>然后再学习本篇比较好. 1.回顾NS

iOS开发之网络编程--使用NSURLConnection实现大文件下载

主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3.在获取data的代理方法中,先设置句柄在沙盒全路径文件末尾,然后通过句柄写入data数据.4.在文件下载完的代理方法中,关闭句柄同时设置句柄引用为nil释放句柄和指针. 使用句柄的思路图(红色的箭头表示句柄,灰色的箭头表示移动的路径): 代码关键词: 类:NSFileHandle的方法 1.fil

iOS开发之网络编程--XCode7 更新以来需要手动设置的内容

XCode7 更新以来,默认是不允许加载一些http网络请求,是因为现在网络大部分使用更安全的https协议头. 所以,iOS网络编程如果出现请求无效,事先考虑是否设置一下了以下操作:

iOS开发之网络编程--6、NSURLSessionConfiguration笔记

NSURLSessionConfiguration对象用于初始化NSURLSession对象. 展开请求级别中与NSMutableURLRequest相关的可供选择的方案,我们可以看到NSURLSessionConfiguration对于会话如何产生请求,提供了相当多的控制和灵活性.从网络访问性能,到cookie,安全性,缓存策略,自定义协议,启动事件设置,以及用于移动设备优化的几个新属性,你会发现你一直在寻找的,正是NSURLSessionConfiguration. 会话在初始化时复制它们的

iOS开发之网络编程--1、NSURLSession的基本使用

前言:学习NSURLSession的使用之前,先学习一篇关于NSURLSession的好文章<From NSURLConnection to NSURLSession>或者是国内的译文<从 NSURLConnection 到 NSURLSession>,或者不用学习本人的博客园笔记直接学习<从 NSURLConnection 到 NSURLSession>也是可以的,这篇对NSURLSession的使用有着挺详细的论述.但是本文先粗略介绍一下NSURLSession的基

iOS开发之网络编程--获取文件的MIMEType

前言:有时候我们需要获取文件的MIMEType的信息,下面就介绍关于获取MIMEType的方法. 1.直接百度搜索关键字"MIMEType",你会找到,然后查吧: 2.用代码获取文件的MIMEType信息: 1 #import "GetMIMEType.h" 2 3 #import <MobileCoreServices/MobileCoreServices.h> 4 5 @implementation GetMIMEType 6 7 #pragma m

iOS开发之网络编程--文件下载(一)

文件下载方式: 如果下载的文件比较小,下载方式: 直接用NSData的 +(id)dataWithContentsOfURL:(NSURL*)url; 利用NSURLConnection发送一个HTTP请求去下载 如果是下载图片,还可以利用SDWebImage框架(本文这里不描述) 如果下载的文件比较大,下载方式: 使用NSConnectionDataDelegate代理方法 建议使用NSURLSession或者第三方框架(本文这里不描述) 代码示例: 先给出用来做代码练习的API接口 小图片: