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

简介:

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传。

   在实际开发中,输入输出流用的比较少,但是用起来也是很方便的。iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理。

   输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:

代码关键词:

   1、在接收到响应头的代理方法里创建输出流(根据上面的图,下载自然需要创建输出流NSOutputStream)。

   2、在接收数据的代理方法中写(write)数据,注意写入的是data字节(data.bytes)。

   3、最后在下载完毕的代理方法里关闭输出流。

用来做代码练习的API接口:

MP4小视频:http://120.25.226.186:32812/resources/videos/minion_01.mp4

完整的关键代码:

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic ,assign)NSInteger totalSzie;
@property (nonatomic ,assign)NSInteger currentSzie;
@property (nonatomic, strong) NSString *fileName;
/** 文件的路径*/
@property (nonatomic ,strong) NSString *fullPath;
/** 请求对象*/
@property (nonatomic ,strong)NSURLConnection *connect;
/** 输出流*/
@property (nonatomic ,strong)NSOutputStream *stream;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@end

@implementation ViewController
#pragma mark ----------------------
#pragma mark Events
- (IBAction)downloadBtnClick:(id)sender
{
 
// [[NSFileManager defaultManager] removeItemAtPath:self.fullPath error:nil];
 
 [self download];
}
- (IBAction)cancelBtnClick:(id)sender
{
 //取消网络请求
 [self.connect cancel];
}

#pragma mark ----------------------
#pragma mark Methods
-(void)download
{
 NSLog(@"------");
 //1.确定url
 NSURL *url =[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];
 
 //2.创建请求对象
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 
 //设置请求头信息,说明只需要请求该资源的一部分数据
 /*
 bytes=0-1000 表示下载0~1000的数据
 bytes=0- 表示从0开始下载直到下载完毕
 bytes=100- 表示从0开始下载直到下载完毕
 */
 NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentSzie];
 [request setValue:range forHTTPHeaderField:@"Range"];
 NSLog(@"%@",range);
 
 //3.发送异步请求
 self.connect = [NSURLConnection connectionWithRequest:request delegate:self];
}

#pragma mark ----------------------
#pragma mark NSURLConnectionDataDelegate
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
 NSLog(@"--didReceiveResponse-");
 
 //判断是否已经下载过了
 if (self.currentSzie >0) {
 return;
 }
 
 //0.获得文件的总大小
 //expectedContentLength是本次请求的数据的大小,并不是整个
 self.totalSzie = response.expectedContentLength;
 
 //1.得到文件的名称
 self.fileName = response.suggestedFilename;
 
 //2.获得文件的全路径
 //caches
 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
 
 NSString *fullPath = [caches stringByAppendingPathComponent:self.fileName];
 self.fullPath = fullPath;
 
 //3.创建输出流
 /*
 第一个参数: 写入数据的地址
 第二个参数: 表示要不要追加 断点续传肯定要追加
 */
 NSOutputStream *stream = [[NSOutputStream alloc]initToFileAtPath:fullPath append:YES];
 self.stream = stream;
 
 //4.打开数据流
 // 如果文件不存在,那么会自动创建一个空的文件
 [self.stream open];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
 //写数据
 /*
 第一个参数:要写的数据
 第二个参数:数据的长度
 */
 [self.stream write:data.bytes maxLength:data.length];
 
 
 //3.累加当前下载的数据大小
 self.currentSzie +=data.length;
 
 //4.计算文件的下载进度
 NSLog(@"%f",1.0 * self.currentSzie / self.totalSzie);
 
 self.progressView.progress = 1.0 * self.currentSzie / self.totalSzie;
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
 NSLog(@"%@",self.fullPath);
 
 //1.关闭输出流
 [self.stream close];
 
 //2.清空指针
 self.stream = nil;
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
}

@end
AI 代码解读

目录
打赏
0
0
0
0
21
分享
相关文章
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
100 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
59 12
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
84 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
86 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
87 0
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
153 56
|
8月前
|
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
网络速率与下载速率
【8月更文挑战第8天】
933 1
网络速率与下载速率
【干货】Python下载网络小说
【干货】Python下载网络小说
网络请求和下载,ping baidu Ctrl + C停掉,wegt命令可以在命令行内下载网络文件
网络请求和下载,ping baidu Ctrl + C停掉,wegt命令可以在命令行内下载网络文件

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等