#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