亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS開發——下載器的功能基本實現

2019-11-14 18:51:42
字體:
來源:轉載
供稿:網友

今天,做了一個下載器的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];}

這只是下載功能的基本實現,接下來會添加下載進度條,并對下載操作進行跟多優化(多線程,斷點續傳等),最后會對下載操作進行封裝。

感謝閱讀!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品va在线播放| 欧美福利视频在线观看| 亚洲伦理中文字幕| 亚洲成人黄色网址| 欧美日韩成人在线观看| 欧美另类极品videosbest最新版本| www.久久草.com| 国产在线98福利播放视频| 亚洲日本成人网| 69视频在线播放| 日韩精品中文字幕视频在线| 亚洲欧洲国产精品| 色先锋久久影院av| 欧美日韩国产一区在线| 欧美成人精品影院| 91国内精品久久| 国产精品久久久久久久久久99| 91精品国产综合久久香蕉最新版| 日韩免费视频在线观看| 国产在线播放91| 亚洲成年人影院在线| 91产国在线观看动作片喷水| 国产精品免费一区豆花| xvideos成人免费中文版| 国产精品视频区1| 国产精品午夜一区二区欲梦| 精品国产一区二区三区久久狼黑人| 国产精品免费网站| 国产精品一区二区av影院萌芽| 97国产精品久久| 色偷偷偷亚洲综合网另类| 亚洲电影免费在线观看| 久久69精品久久久久久久电影好| 上原亚衣av一区二区三区| 最新国产成人av网站网址麻豆| 欧美日韩在线观看视频| 亚洲日韩欧美视频| 久久噜噜噜精品国产亚洲综合| 在线播放国产一区中文字幕剧情欧美| 黄网动漫久久久| 日本不卡免费高清视频| 国产精品大片wwwwww| 亚洲精品久久久久中文字幕欢迎你| 国语自产在线不卡| 97香蕉久久夜色精品国产| 欧美日韩视频在线| 一区二区三区四区在线观看视频| 久久久久女教师免费一区| 亚洲欧美日韩直播| 日韩视频免费观看| 青草青草久热精品视频在线观看| 国产精品久久久久久久久| 大荫蒂欧美视频另类xxxx| 午夜精品国产精品大乳美女| 欧美激情在线一区| 欧美性xxxxxxxxx| 精品香蕉在线观看视频一| 欧美xxxx综合视频| 欧美多人乱p欧美4p久久| 亚洲成人久久网| 亚洲国产精品大全| 欧美视频第一页| 国内免费精品永久在线视频| 日韩av片电影专区| 亚洲福利视频在线| 福利视频导航一区| 亚州av一区二区| 日韩欧美在线看| 亚洲精品国精品久久99热| 国产精品三级网站| 欧美—级高清免费播放| 91麻豆国产精品| 最近中文字幕2019免费| xxx成人少妇69| 97精品在线观看| 欧美性xxxxx极品| 在线视频中文亚洲| 欧美大片免费观看在线观看网站推荐| 日韩精品视频中文在线观看| 日韩在线观看免费全集电视剧网站| 国产精品一区二区在线| 91超碰caoporn97人人| 中文字幕日韩精品有码视频| 午夜剧场成人观在线视频免费观看| 欧美午夜无遮挡| 777国产偷窥盗摄精品视频| 久久手机免费视频| 伊人久久精品视频| 久久精品国产免费观看| 久久久电影免费观看完整版| 精品国产91久久久久久老师| 国产精品1234| 国产精品久久久久久av福利软件| 亚洲毛片在线观看| 国产精品v片在线观看不卡| 91视频国产精品| 亚洲欧美国产高清va在线播| 亚洲一区二区在线播放| 伊人一区二区三区久久精品| 久久久久国产精品www| 日韩黄在线观看| 中日韩美女免费视频网址在线观看| 国产精品成人品| 视频在线观看一区二区| 欧美xxxx18性欧美| 欧美激情精品久久久久| 欧美性受xxxx白人性爽| 欧美与欧洲交xxxx免费观看| 国产精品一区久久| 久久精品99久久香蕉国产色戒| 亚洲国产美女精品久久久久∴| 中文字幕日韩欧美在线视频| 91亚洲精品久久久久久久久久久久| 亚洲激情第一页| 亚洲黄一区二区| 成人综合国产精品| 久久九九精品99国产精品| 欧美性xxxxhd| 66m—66摸成人免费视频| 91网站免费观看| 欧美大片在线看免费观看| 亚洲欧美激情在线视频| 成人激情视频在线观看| 精品久久久91| 欧美午夜精品久久久久久浪潮| 国产精品免费在线免费| 国内精久久久久久久久久人| 激情亚洲一区二区三区四区| 国产精品电影一区| 成人午夜在线影院| 狠狠色香婷婷久久亚洲精品| 亚洲国产精品成人一区二区| 日韩美女在线观看| 2019中文字幕免费视频| 日日狠狠久久偷偷四色综合免费| 久久99精品国产99久久6尤物| 中文字幕最新精品| 国产欧美最新羞羞视频在线观看| 日韩男女性生活视频| 亚洲色图欧美制服丝袜另类第一页| 久久躁日日躁aaaaxxxx| 日韩在线免费高清视频| 久久99国产精品久久久久久久久| 成人国产亚洲精品a区天堂华泰| 国产玖玖精品视频| 欧美性xxxxxxxxx| 亚洲理论片在线观看| 久久久久女教师免费一区| 亚洲精品免费av| 国产精品揄拍一区二区| 日韩精品在线观看一区二区| 久久影视电视剧免费网站清宫辞电视| 亚洲国产成人一区| 日本精品性网站在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲欧洲国产一区| 欧美日韩在线视频首页| 国产精品网址在线| 91理论片午午论夜理片久久| 成人免费观看49www在线观看| 久久久久一本一区二区青青蜜月| 国产精品成人v| 97精品在线视频| 精品福利免费观看|