標籤:
這裡使用的是NSURLConnection的代理請求下載,並且是具有進度,UI能即時重新整理,至於NSURLConnection如何請求、並且有幾種要求方法請看NSURLConnection請求簡介,在這裡的話我們以下載一本書籍為例,下面為它的地址(這是在百度雲裡面弄的,連結是別人加密了,所有比較長)
http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804
代碼:
1、首先在storyboard裡面拖入一個Progress View(進度條)控制項2、在控制器中拖入Progress View屬性,並且另外添加三個屬性,如下: @interface ViewController ()<NSURLConnectionDelegate> /** 進度條屬性*/ @property (weak, nonatomic) IBOutlet UIProgressView *progressView; /** 檔案總大小 */ @property (nonatomic, assign) NSUInteger totalLength; /** 檔案當前大小 */ @property (nonatomic, assign) NSUInteger currentLength; /** 檔案路徑 */ @property (nonatomic, copy) NSString *path; @end3、確定它的URL,以及請求,並且設定它的代理,然後發送所謂的代理請求 - (void)viewDidLoad { [super viewDidLoad]; //1、確定URL NSURL *url = [NSURL URLWithString:@"http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804"]; //2、建立請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3、代理請求 /* 第一個參數:請求對象 第二個參數:誰成為代理 第三個參數:startImmediately :是否立即開始發送網路請求 */ NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO]; [connection start]; }4、在這個Demo中,代理有兩個方法是很重要的 4.1、第一個就是剛開始響應的時候,在回應標頭中,我可以擷取檔案的預估大小和檔案名稱尾碼,用來建立檔案夾和記錄檔案的總大小,用於後面的計算 4.2、第二個就是每次接受到伺服器資料的時候,我可以往某個檔案寫資料,以及計算每次佔比例的多少 //1.當接受到伺服器響應的時候會調用:response(回應標頭) -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"接受到響應"); //1、在回應標頭中有一個預估的檔案大小expectedContentLength self.totalLength = response.expectedContentLength; //這裡你們可以列印看看 然後在網頁的要求標頭也可以去對比一下,看是否為一樣 // NSLog(@"totalLength = %lld", response.expectedContentLength); //2、這裡的話為了讓效能好一點,我直接在沙箱的Caches中建立一個檔案夾直接寫的硬碟上,而不是記憶體中 //2.1、這裡是地址為 在沙箱路徑的Caches中 添加一個檔案名稱為suggestedFilename的檔案,suggestedFilename是回應標頭中的,也是百度雲弄的名字你們也可以列印看看 // NSLog(@"%@",response.suggestedFilename); NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingString:response.suggestedFilename]; //2.2、拿到地址那我們開始建立一個空得檔案夾,並且路徑給外面的path屬性,用於後面拿到位置下載 NSFileManager *manager = [NSFileManager defaultManager]; [manager createFileAtPath:path contents:nil attributes:nil]; self.path = path; } //2.當接受到伺服器返回資料的時候調用(會調用多次) -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // 1、建立一個操作檔案的控制代碼,並且給予上次的建立檔案夾的地址。 NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path]; //設定寫入方式,自上次後面寫入 [handle seekToEndOfFile]; // 2、利用控制代碼往檔案中寫入資料 [handle writeData:data]; // 3、計算當前接收到得資料的總數 這裡就是記錄每一次寫入資料的多少 self.currentLength += data.length; // 4、計算下載比例 self.progressView.progress = 1.0 * self.currentLength/self.totalLength; } //3.當請求失敗的時候調用 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"請求失敗"); } //4.當請求結束(成功|失敗)的時候調用 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"請求結束"); }
補充
在這個Demo中唯一的優點就是節約了記憶體,因為每一次寫都寫到了硬碟中去,而不是記憶體中,現在你們可以開啟你們自己的沙箱裡面應該會有一個PDF的檔案也就是剛剛下載的,這個Demo中最重要的方法為:
//1.當接受到伺服器響應的時候會調用:response(回應標頭)-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{} //2.當接受到伺服器返回資料的時候調用(會調用多次)-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{}
結束
iOS開發--網路下載