iOS開發NSURLConnection 斷點續傳
比如請求的資料大小是0~1000的話斷點續傳的原理酒如同下面的分段解析
分塊請求 Request 請求頭 通過包含引數
如果下載 0~500 Range 0-500
500~1000 500-1000
200~800 200-800
200~最後 200-
例子:下載檔案斷點續下自定義下載工具類.m中
#import@interface downLoad : NSObject//傳下載進度(block傳值) 0~1
@property (nonatomic,strong) void(^progressValue)(float);//設定一個url 待下載的連結(url) 下載的路徑(儲存下載檔案)//初始化方法-(instancetype)initWithURL:(NSString *)url toFirlPath:(NSString *)path;//開始下載-(void)start;//停止下載-(void)stop;@end定義下載工具類.h中#import "downLoad.h"#import@implementation downLoad
{
// 定義一個全域性的發起下載的Connection物件
NSURLConnection *_connection;
// 計算當前下載的進度
unsigned long long _currentLength;
// 下載檔案的總進度
long long _totalLength;
// 定義一個檔案讀寫的控制程式碼
NSFileHandle *_fileHandle;
NSString *_url;
NSString *_path;
}
//設定一個url 待下載的連結(url) 下載的路徑(儲存下載檔案)
-(instancetype)initWithURL:(NSString *)url toFirlPath:(NSString *)path
{
if (self=[super init]) {
_url=url;
_path=path;
[self creatConnection:url file:path];
}
return self;
}
//封裝之前的程式碼和方法
-(void)creatConnection:(NSString *)url file:(NSString *)path
{
NSURL *myURL=[NSURL URLWithString:url];
NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:myURL];
NSFileManager *manager=[NSFileManager defaultManager];
_fileHandle=[NSFileHandle fileHandleForUpdatingAtPath:path];
// 判斷存不存在已下載資料的檔案
if ([manager fileExistsAtPath:path]) {
// 如果存在計算出已經下載檔案的大小
_currentLength =[_fileHandle seekToEndOfFile];
// 設定請求資料的範圍 key : Range value @"bytes_currentLength-"
[request setValue:@"Range" forHTTPHeaderField:[NSString stringWithFormat:@"bytes=%llu-",_currentLength]];
}else{
// 不存在 建立檔案
[manager createFileAtPath:path contents:nil attributes:nil];
// 設定檔案的長度為0
_currentLength=0;
}
_connection=[[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
}
//開始下載
-(void)start
{
if (!_connection) {
// 資料為空得時候建立
[self creatConnection:_url file:_path];
}
[_connection start];
}
//停止下載
-(void)stop
{
[_connection cancel];
_connection=nil;
}
//實現下載的協議方法 NSURLConnectionDataDelegate
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//請求資料成功後 伺服器返回一個資料資訊(reponse)包含所下載資料的總長度
// 資料總長度
_totalLength=response.expectedContentLength;
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//一點點的返回資料 同時實現一點點的寫入檔案
[_fileHandle writeData:data];
// 同步增加已下載資料的位元組數_
_currentLength +=[data length];
// 呼叫之前定義的block來時刻改變prograssView的值(呼叫block把當前的下載進度傳過去)
self.progressValue((float)_currentLength/_totalLength);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//下載完成了給個UI提示
UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:nil message:@"下載完成" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
[alertView show];
}
@end
系統vc類的.h中
#import "ViewController.h"
#import "downLoad.h"
@interface ViewController ()
@end
@implementation ViewController
{
downLoad *_download;
}
- (void)viewDidLoad {
[super viewDidLoad];
// 獲取沙盒路徑 拼接後 存入沙盒
NSString *path=[NSString stringWithFormat:@"%@/download.zip",NSHomeDirectory()];
// 獲取url的路徑
NSString *url =@"Http://10.0.179.123/1531/Xcode6.4.zip";
//建立下載物件
_download =[[downLoad alloc]initWithURL:url toFirlPath:path];
// 取消迴圈引用的條件
__weak ViewController *object=self;
// block 賦值
_download.progressValue=^(float value){
object.progress.progress=value;
};
NSLog(@"%@",path);
}
- (IBAction)start:(id)sender {
[_download start];
}
- (IBAction)stop:(id)sender {
[_download stop];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
相關文章
- iOS 開發之 NSURLSession 下載和斷點續傳iOSSession斷點
- iOS大檔案斷點續傳iOS斷點
- iOS 應用開發中的斷點續傳實踐總結iOS斷點
- 斷點續傳斷點
- Android 斷點續傳Android斷點
- iOS11 下載之斷點續傳的bugiOS斷點
- 斷點續傳教學例子斷點
- 簡單的斷點續傳斷點
- 斷點續傳更新版斷點
- 上傳——斷點續傳之理論篇斷點
- 大檔案斷點下載(NSURLConnection)斷點
- iOS開發 GET、POST請求方法:NSURLConnection篇iOS
- 上傳——斷點續傳之實踐篇斷點
- 12. 斷點續傳的原理斷點
- scp實現斷點續傳---rsync斷點
- 關於http斷點續傳那點事HTTP斷點
- iOS開發 - Xcode不走斷點iOSXCode斷點
- OkHttp使用+檔案的上傳+斷點續傳HTTP斷點
- HTTP檔案斷點續傳的原理HTTP斷點
- 用Java實現斷點續傳(HTTP)Java斷點HTTP
- Java實現檔案斷點續傳Java斷點
- 大檔案上傳、斷點續傳、秒傳、beego、vue斷點GoVue
- OSS網頁上傳和斷點續傳(STSToken篇)網頁斷點
- C# FTP上傳下載(支援斷點續傳)C#FTP斷點
- C# 上傳下載ftp(支援斷點續傳)C#FTP斷點
- 1. 大檔案上傳如何斷點續傳斷點
- iOS 下載URL不斷改變的情況下 使用 resumeData做斷點續傳iOS斷點
- VUE-多檔案斷點續傳、秒傳、分片上傳Vue斷點
- JAVA編寫的斷點續傳小程式Java斷點
- 使用curl斷點續傳下載檔案斷點
- 斷點續傳瞭解一下啊?斷點
- Winform檔案下載之斷點續傳ORM斷點
- C# 斷點續傳原理與實現C#斷點
- 支援斷點續傳的大檔案傳輸協議斷點協議
- OSS網頁上傳和斷點續傳(OSS配置篇)網頁斷點
- OSS網頁上傳和斷點續傳(終結篇)網頁斷點
- JAVA實現大檔案分片上傳斷點續傳Java斷點
- Linux斷點續傳檔案功能詳解Linux斷點