你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟完成下載器的根本功效(1)

iOS開辟完成下載器的根本功效(1)

編輯:IOS開發綜合

明天,做了一個下載器的Demo,即從當地設置裝備擺設的Apache辦事器上,下載指定的文件。此次,我們下載辦事器根目次下的html.mp4文件。
依照通例,我們先創立一個URL對象和要求。
 NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/html.mp4"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
這裡有兩點須要留意,第一,這個url的字符串是全英文的,假如在字符串中湧現了中文,我們就不克不及直接挪用URLWithString:這個辦法,而是要先將url字符串存入一個字符串對象中,再將這個字符通同過 
[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
辦法才可以,不然沒法正常要求。 
因為是下載操作,我們就須要用到NSURLConnection的署理辦法來完成,條件是先創立銜接對象和對象的署理。 
//樹立銜接,立刻履行
[NSURLConnection connectionWithRequest:request delegate:self]; 
 如今成績來了,署理不止一個可選,<NSURLConnectionDownloadDelegate>和<NSURLConnectionDataDelegate>,首次接觸,天性地選擇了第一個署理(由於從名字來看,第一個最像)。假如您的設法主意和我一樣,那就錯了,第一個署理中的辦法完成後,確切可以取得數據,然則不曉得數據存在了哪裡,其實不是我們指定的途徑,您可以測驗考試一下。
 好,經由第一次的掉敗,我們選擇第二個署理,進入頭文件,我們看到了四個辦法:

//取得呼應
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
//獲得數據
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//斷開銜接
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
//產生毛病
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 

我們可以清晰地懂得每一個辦法的感化,您有興致可以打印下每一個辦法的參數瞧一瞧。
這裡須要彌補的是,我們加了幾個屬性

/// 文件下載流
@property (strong, nonatomic) NSOutputStream *fileStream;
/// 記載文件總長度
@property (assign, nonatomic) long long fileLength;
/// 文件以後長度
@property (assign, nonatomic) long long currentFileLength; 

關於NSOutputStream,還有一個NSFileHandle可以和他停止比擬,只是後者會形成文件被反復追加。是以,我們選擇前者。依據類名我們可以揣摸出應當還有一個NSInputStream,沒錯,一個下載流,一個上傳流。 

第一步。在取得呼應的辦法中,我們從response參數裡取得文件的總長度,而且置以後曾經下載的文件長度是0,開啟一個保留到指定途徑的下載流,這裡我們保留到桌面。

//取得呼應
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
  self.fileLength = response.expectedContentLength;
  //以後文件長度置零
  self.currentFileLength = 0;
  self.fileStream = [[NSOutputStream alloc] initToFileAtPath:@"/Users/xxx/Desktop/html.mp4" append:YES];
  [self.fileStream open];
}

第二步。我們取得了數據,假如您在這個辦法中打印數據,您就會發明當文件夠年夜(幾M就行)時,這個辦法會被挪用屢次,也就是說,分屢次獲得數據。所以我們在這個辦法中拼接數據,同時也要防止數據拼接後形成占用過量內存。我們累加已下載的數據的長度,盤算已下載的百分比,並寫入數據流中。在盤算百分比時,記得轉換類型哦,否則成果都是0,除最初一個是1。

//獲得數據
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//  NSLog(@"did receive:%@",data);
  self.currentFileLength += data.length;
  float progressPercent = (float)self.currentFileLength / self.fileLength;
  NSLog(@"have downloaded: %f", progressPercent);
  [self.fileStream write:data.bytes maxLength:data.length];
}

最初一步。現實上是兩個辦法,一個是下載完成挪用,一個是下載掉敗挪用。有一點須要留意,不管下載勝利或掉敗,都須要把文件輸入流封閉。

//斷開銜接
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
  NSLog(@"銜接停止");
  [self.fileStream close];
}

//產生毛病
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
  NSLog(@"%@",error);
  [self.fileStream close];
} 

這只是下載功效的根本完成,接上去會添加下載進度條,並對下載操作停止跟多優化(多線程,斷點續傳等),最初會對下載操作停止封裝。

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐本站。

【iOS開辟完成下載器的根本功效(1)】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved