iOS中 断点下载详解

简介:

布局如下:



基本拖拉属性:

[objc]  view plain  copy
  1. #import "ViewController.h"  
  2. #import "AFNetworking.h"  
  3.   
  4. @interface ViewController ()  
  5.   
  6. @property (weak, nonatomic) IBOutlet UILabel *progressLabel;  
  7.   
  8. @property (weak, nonatomic) IBOutlet UIProgressView *progressView;  
  9.   
  10. @property (nonatomicstrongAFHTTPRequestOperation *operation;  
  11.   
  12. @end  
  13.   
  14. @implementation ViewController  



调用:

[objc]  view plain  copy
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.       
  5.     NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;  
  6.       
  7.     NSString *txtPath = [cachePath stringByAppendingPathComponent:@"mvTemp/mv.txt"];  
  8.     NSFileManager *fileManager = [NSFileManager defaultManager];  
  9.       
  10.     if ([fileManager fileExistsAtPath:txtPath]) {  
  11.         self.progressView.progress = [[NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil] floatValue];  
  12.         self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", _progressView.progress * 100];  
  13.           
  14.     } else {  
  15.         self.progressView.progress = 0;  
  16.         self.progressLabel.text = @"0%";  
  17.     }  
  18.     NSLog(@"%@", NSHomeDirectory());  
  19.       
  20. }  

点击事件:

[objc]  view plain  copy
  1. - (IBAction)startOrCancelDownLoad:(UIButton *)sender  
  2. {  
  3.     if ([sender.currentTitle isEqualToString:@"开始下载"]) {  
  4.         [sender setTitle:@"暂停下载" forState:UIControlStateNormal];  
  5.           
  6.          
  7.         NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;  
  8.         NSString *filePath = [cachePath stringByAppendingPathComponent:@"mv"];  
  9.         NSString *tempPath = [cachePath stringByAppendingPathComponent:@"mvTemp"];  
  10.         NSFileManager *fileManager = [NSFileManager defaultManager];  
  11.         if (![fileManager fileExistsAtPath:filePath]) {  
  12.             [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];  
  13.         }  
  14.         if (![fileManager fileExistsAtPath:tempPath]) {  
  15.             [fileManager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil];  
  16.         }  
  17.         NSString *mp4TempPath = [tempPath stringByAppendingPathComponent:@"mv.temp"];  
  18.         NSString *txtTempPath = [tempPath stringByAppendingPathComponent:@"mv.txt"];  
  19.         NSString *mp4Path = [filePath stringByAppendingPathComponent:@"mv.mp4"];  
  20.         NSURL *url = [NSURL URLWithString:@"http://video.szzhangchu.com/1442395443772_5176326090.mp4"];  
  21.         NSURLRequest *request = [NSURLRequest requestWithURL:url];  
  22.         unsigned long long downLoadBytes = 0;  
  23.         if ([fileManager fileExistsAtPath:mp4TempPath]) {  
  24.             downLoadBytes = [self fileSizeAtPath:mp4TempPath];  
  25.             NSString *range = [NSString stringWithFormat:@"bytes=%llu-", downLoadBytes];  
  26.             NSMutableURLRequest *mutableRequest = [request mutableCopy];  
  27.             [mutableRequest setValue:range forHTTPHeaderField:@"Range"];  
  28.             request = mutableRequest;  
  29.         }  
  30.         if (![fileManager fileExistsAtPath:mp4Path]) {  
  31.             self.operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];  
  32.             [self.operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:mp4TempPath append:YES]];  
  33.             __weak typeof(self) weakSelf = self;  
  34.             [_operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {  
  35.                 weakSelf.progressView.progress = (float)(totalBytesRead + downLoadBytes) / (float)(totalBytesExpectedToRead + downLoadBytes);  
  36.                 weakSelf.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", weakSelf.progressView.progress * 100];  
  37.                 NSString *progress = [NSString stringWithFormat:@"%.3f", weakSelf.progressView.progress];  
  38.                 [progress writeToFile:txtTempPath atomically:YES encoding:NSUTF8StringEncoding error:nil];  
  39.                   
  40.             }];  
  41.               
  42.             [_operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {  
  43.                   
  44.                 [fileManager moveItemAtPath:mp4TempPath toPath:mp4Path error:nil];  
  45.                 [fileManager removeItemAtPath:txtTempPath error:nil];  
  46.                   
  47.             } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
  48.                   
  49.             }];  
  50.               
  51.             [_operation start];  
  52.         }  
  53.           
  54.     } else {  
  55.         [sender setTitle:@"开始下载" forState:UIControlStateNormal];  
  56.         [self.operation cancel];  
  57.         _operation = nil;  
  58.     }  
  59.       
  60.       
  61.       
  62. }  

[objc]  view plain  copy
  1. - (unsigned long long)fileSizeAtPath:(NSString *)path  
  2. {  
  3.     unsigned long long fileSize = 0;  
  4.     NSFileManager *fileManager = [NSFileManager defaultManager];  
  5.     if ([fileManager fileExistsAtPath:path]) {  
  6.         NSError *error = nil;  
  7.         NSDictionary *dict = [fileManager attributesOfItemAtPath:path error:&error];  
  8.         if (dict && !error) {  
  9.             fileSize = [dict fileSize];  
  10.         }  
  11.     }  
  12.     return fileSize;  
  13. }  

最终效果如下:


用到的第三方数据请求:AFNetworking,大家应该都有,这里不做介绍


关注博主微博每日更新技术:http://weibo.com/hanjunqiang


原文地址:http://blog.csdn.net/qq_31810357/article/details/49882769
相关文章
|
8月前
|
Swift iOS开发
iOS OC混编Swift 后者无法走断点
iOS OC混编Swift 后者无法走断点
53 0
|
iOS开发 API 开发者
关于iOS的后台下载和断点续传,说一说自己的理解
首先,后台下载和断点续传是两件事;这里放在一起说是为了图个方便,实际二者在技术实现上没有什么关联。 目前我们的下载实现一般都是基于nsurlsession和iOS7+的,所以我们这里不考虑iOS6和以前的老系统,主要技术实现也是基于nsurlsession. 先说后台下载: 1. 在没有特别关注的情况下,可能很多开发者使用afnetworking下载的姿势并没有考虑到后台下载这一块。
1650 0
|
iOS开发
iOS中 断点下载详解 韩俊强的博客
布局如下: 基本拖拉属性: #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UILab...
778 0
|
iOS开发 存储
iOS开发网络篇—大文件的多线程断点下载
iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载。项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件。因为实现过程较为复杂,所以下面贴出完整的代码。 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分)。
866 0
|
iOS开发
IOS断点上传思路
http://segmentfault.com/q/1010000000150843
611 0
|
iOS开发 NoSQL API
xcode反汇编调试iOS模拟器程序(四)自动断点应用之NSNotificationCenter
知道怎么查看后,先看看有什么实际应用,拿NSNotificationCenter来做实践吧。 首先在某个容易进入的地方加断点,并停在那,例如main函数。
1114 0
|
6天前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
116 3
|
6天前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
128 2
|
6天前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
43 3