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

相关文章
|
3月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
268 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
2月前
|
API
鸿蒙开发:切换至基于rcp的网络请求
本文的内容主要是把之前基于http封装的库,修改为当前的Remote Communication Kit(远场通信服务),无非就是通信的方式变了,其他都大差不差。
103 4
鸿蒙开发:切换至基于rcp的网络请求
|
2月前
|
存储 网络协议 物联网
C 语言物联网开发之网络通信与数据传输难题
本文探讨了C语言在物联网开发中遇到的网络通信与数据传输挑战,分析了常见问题并提出了优化策略,旨在提高数据传输效率和系统稳定性。
|
3月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
208 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
5月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
数据安全/隐私保护 iOS开发
iOS开发网络篇—NSURLConnection基本使用
一、NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体.... (3)NSMutableURLRequest:NSURLRequest的子类 (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。
679 0
|
数据安全/隐私保护 iOS开发
iOS开发网络篇—NSURLConnection基本使用
iOS开发网络篇—NSURLConnection基本使用 一、NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体.... (3)NSMutableURLRequest:NSURLRequest的子类 (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。
850 0
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。

热门文章

最新文章