<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHByZSBjbGFzcz0="brush:java;">#import "MainViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//下載文件
[self download];
}
-(void)download
{
//1. NSURL
NSURL *url = [NSURL URLWithString:@"http://loacal/~apple/itcase/download/iTunesConnect_DeveloperGuide_CN.zip"];
//2NSRequest
//要判斷網絡服務器上文件的大小,可以使用Http的HEAD方法
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//使用HEAD方法,僅獲取目標文件的信息,而不做實際的下載工作。
//[request setHTTPMethod:@"HEAD"];
/**
設置斷點續傳的思路:
HeaderField:頭域(請求頭部的字段)
可以通過指定range的范圍逐步地下載指定范圍內的數據,待下載完成後,再將這些數據拼接成一個文件。
1根據HEAD方法獲取到要下載的文件的總大小、
2在磁盤上建立一個臨時的緩沖文件,該文件的大小與目標文件大小一致
3緩沖文件中所有字節都是默認為0
4開啟多線程,分別加載不同的range頭指定的數據塊,待數據塊加載完成以後,將其分別寫入對應的偏移地址。
5所有數據下載完成以後,表示文件下載完成,將臨時文件名更改為目標文件。
開發的難點:
0 在寫入文件之前,首先要建立一個同等大小的文件。
1 文件的讀寫問題,在oc裡默認是覆蓋,追加,如果要指定位置,需要用seek方法,移動文件指針。
2在多線程寫入文件時,文件的鎖定操作是一個問題。
*/
[request setValue:@"bytes=0-499" forKeyPath:@"range"];//表示只讀取數據的第0個字節到第499個字節。
//3NSURLConnection
//如果要獲取文件長度,可以在Response中獲取到
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
//在response的expectedcontentlength屬性中,可以獲知要卸載的文件的文件長度。
NSLog(@"%lld %d%@", [response expectedContentLength], data.length, data);
}
@end