网络:取消下载
来源:互联网 发布:郯城马头淘宝村车祸 编辑:程序博客网 时间:2024/04/30 02:27
#import "ViewController.h"@interface ViewController ()<NSURLConnectionDataDelegate>@property (nonatomic, assign) long long fileSize; // 文件总大小@property (nonatomic, assign) long long currentSize; // 当前接收的文件大小@property (nonatomic, strong) NSOutputStream *output; // 文件输出流@property (nonatomic, strong) NSURLConnection *connection; // 下载请求连接@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // [self serverFileSize];}// 断点续传- (IBAction)pause:(id)sender { // 取消下载,只能取消,如果下一次开始下载,又重新开始 [self.connection cancel];}// 我们在使用别人的软件的时候,点击下载会怎么样?// 提示这个文件是多大,是否下载- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self serverFileSize];}// HEAD用来请求查看文件大小- (void)serverFileSize { // NSURL NSString *URLStr =@"http://localhost/01UI基础复习.mp4"; // 百分号转码 URLStr = [URLStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:URLStr]; // NSURLRequest 获取文件大小,不是使用GET,而是使用HEAD NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"HEAD"]; NSURLResponse *response; // 获取文件大小,是使用同步 [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; // 文件总大小 // NSLog(@"%@",response); self.fileSize = response.expectedContentLength; // NSLog(@"%lld",fileSize); // 提示用户文件总大下,是否需要下载 // 下载文件 [self download:url];}- (void)download:(NSURL *)url { dispatch_async(dispatch_get_global_queue(0, 0), ^{ // NSURLRequest 下载文件,从服务器获取的意思 GET NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 开始下载文件, 知道下载的进度 // 代理回调的线程,跟执行这一行代码的线程是同一个 self.connection = [NSURLConnection connectionWithRequest:request delegate:self];// NSLog(@"开始下载文件"); // 开启运行循环,才能让子线程保持 // 什么时候需要开启运行循环 /** 1. 子线程需要保持,NSTimer 2. 代理回调(代理,block) */ [[NSRunLoop currentRunLoop] run]; });}#pragma mark - NSURLConnection 代理/** NSFileHandle 选择写入文件的方式初始化,在写入文件之前先把光标移动文件的最后,写完之后关闭 NSOutputStream 初始化的时候选择拼接文件,再打开流,写入数据(多次),关闭流 */// 接收到响应- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"接收到响应%@ -- %lld",response,response.expectedContentLength); // NSHTTPURLResponse *httpResp // self.fileSize = response.expectedContentLength; // 文件总大小 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"123.mp4"]; NSLog(@"%@",path); self.output = [[NSOutputStream alloc]initToFileAtPath:path append:YES]; // 在写入编辑文件之前,打开文件 [self.output open];}// 如果代理方法在主线程中执行/** 1. 方法会调用很多次 2. 如果主线程没空,不会调用代理(视力滚动的时候,或者在做其他事情),也就是相当于不下载 */- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // NSLog(@"接收到数据 %zd",data.length); // 如果需要知道进度,首要要知道文件的总大小,还要接收了多少 self.currentSize += data.length; NSLog(@"%f",(CGFloat)self.currentSize / self.fileSize); // uunt8_t -> NSData // [NSData dataWithBytes:<#(nullable const void *)#> length:<#(NSUInteger)#>] [self.output write:data.bytes maxLength:data.length]; NSLog(@"%@",[NSThread currentThread]);}- (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"下载完成了"); // 关闭文件流 [self.output close];}- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"出错了");}@end
0 0
- 网络:取消下载
- 取消迅雷默认下载
- [开发工具]_[网络]_[取消fireforx火狐下载扫描功能]
- 取消网络访问权限
- OKHttp取消网络请求
- 文件下载管理器取消按钮
- 关于简易下载中途取消下载问题
- android 代码取消网络保存
- android 取消网络加载过程
- iOS AFNetworking 取消网络请求
- volley3 网络请求的取消
- Rxjava+Retrofit取消网络请求
- iOS afnetwork取消网络请求
- 网络下载
- Struts2 下载取消报异常最终解决办法
- Struts2 下载取消报异常最终解决办法
- JS点击下载完毕后取消遮罩层
- Mac Apple Store 取消当前下载任务
- Oracle 中 decode 函数用法
- C#中的数组
- 图的最短路径-Dijkstra和Floyd
- iOS基础调试 console
- 关于ADB(android debug bridge)一些操作
- 网络:取消下载
- Thrift lua example
- 面向对象在javascript中的三大特征之多态
- 给char数组或者结构体赋值
- linux sysfs
- LA3938 RAY, Pass me the dishes (动态最大连续和)
- nginx日志配置
- Android 和HTml交互
- 动态改变Menu item的显示字体内容