iOS實(shí)現(xiàn)文件下載功能
本文實(shí)例為大家分享了iOS實(shí)現(xiàn)文件下載的具體代碼,供大家參考,具體內(nèi)容如下
說(shuō)明:
1).獲取網(wǎng)絡(luò)文件大??;
2).開(kāi)啟循環(huán),計(jì)算每段position開(kāi)始與結(jié)束位置,通過(guò)Range頭字段按塊獲取文件數(shù)據(jù)流;
3).使用NSFileHandle追加方式將NSData文件數(shù)據(jù)寫(xiě)入本地文件。
1、用HEAD請(qǐng)求方式獲取網(wǎng)絡(luò)文件大?。?/strong>
/* ?獲取網(wǎng)絡(luò)文件大小 ?*/ - (long long)getNetFileLen:(NSURL *)url{ ? ? //1.創(chuàng)建request ? ? NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10]; ? ? //設(shè)置請(qǐng)求方式為HEAD, 只獲取頭信息 ? ? request.HTTPMethod = @"HEAD"; ? ?? ? ? //2.定義用于接收網(wǎng)絡(luò)數(shù)據(jù)的對(duì)象 ? ? NSURLResponse *response = nil; ? ?? ? ? //3.同步請(qǐng)求網(wǎng)絡(luò),將結(jié)果存入response ? ? [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; ? ?? ? ? //返回文件大小 ? ? return response.expectedContentLength; }
2、開(kāi)啟異步線程,請(qǐng)求網(wǎng)絡(luò)下載文件:
/* ?下載文件 ?*/ - (void)downloadFile:(NSString *)urlStr done:(void (^)())done{ ? ?? ? ? //1.獲取系統(tǒng)自帶全局隊(duì)列 ? ? //并行隊(duì)列,多個(gè)線程并發(fā)執(zhí)行:DISPATCH_QUEUE_PRIORITY_DEFAULT ? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); ? ?? ? ? //2.異步執(zhí)行 ? ? dispatch_async(queue, ^{ ? ? ? ? //創(chuàng)建url對(duì)象 ? ? ? ? NSURL *url = [[NSURL alloc] initWithString:urlStr]; ? ? ? ? NSLog(@"url: %@", urlStr); ? ? ? ?? ? ? ? ? //獲取本地已下載文件大小 ? ? ? ? long long localFileLen = [self getLocalFileLen]; ? ? ? ? NSLog(@"localFileLen : %lld", localFileLen); ? ? ? ?? ? ? ? ? //獲取網(wǎng)絡(luò)文件大小 ? ? ? ? long long netFileLen = [self getNetFileLen:url]; ? ? ? ? NSLog(@"netFileLen : %lld", netFileLen); ? ? ? ?? ? ? ? ? if(localFileLen == netFileLen){//一樣表示存在了 ? ? ? ? ? ? return; ? ? ? ? } ? ? ? ?? ? ? ? ? //每次從服務(wù)端獲取的文件數(shù)據(jù)大小 ? ? ? ? long long itemSize = 1024 * 20; ? ? ? ?? ? ? ? ? //一段數(shù)據(jù)的開(kāi)始position位置 ? ? ? ? long long startPos = 0; ? ? ? ?? ? ? ? ? //一段數(shù)據(jù)的結(jié)尾position位置 ? ? ? ? long long endPos = 0; ? ? ? ?? ? ? ? ? while (startPos < netFileLen) { ? ? ? ? ? ? //計(jì)算結(jié)尾position ? ? ? ? ? ? endPos = startPos + itemSize - 1; ? ? ? ? ? ?? ? ? ? ? ? ? //組裝range字段,用于請(qǐng)求頭 ? ? ? ? ? ? NSString *range = [NSString stringWithFormat:@"Bytes=%lld-%lld", startPos, endPos]; ? ? ? ? ? ?? ? ? ? ? ? ? NSLog(@"range : %@", range); ? ? ? ? ? ?? ? ? ? ? ? ? //重新計(jì)算下一段數(shù)據(jù)開(kāi)始position ? ? ? ? ? ? startPos = startPos + itemSize; ? ? ? ? ? ?? ? ? ? ? ? ? /* ? ? ? ? ? ? ?緩存策略 ? ? ? ? ? ? ?NSURLRequestUseProtocolCachePolicy = 0, 默認(rèn),內(nèi)存緩存 ? ? ? ? ? ? ?NSURLRequestReloadIgnoringLocalCacheData = 1, 忽略本地內(nèi)存緩存 ? ? ? ? ? ? ?NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, ? ? ? ? ? ? ?NSURLRequestReturnCacheDataElseLoad = 2, ? ? ? ? ? ? ?NSURLRequestReturnCacheDataDontLoad = 3, ? ? ? ? ? ? ?*/ ? ? ? ? ? ?? ? ? ? ? ? ? //(1)創(chuàng)建request ? ? ? ? ? ? NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10]; ? ? ? ? ? ?? ? ? ? ? ? ? //設(shè)置Range請(qǐng)求頭 ? ? ? ? ? ? [request setValue:range forHTTPHeaderField:@"Range"]; ? ? ? ? ? ?? ? ? ? ? ? ? //(2)定義用于接收網(wǎng)絡(luò)信息的對(duì)象 ? ? ? ? ? ? NSURLResponse *response = nil; ? ? ? ? ? ?? ? ? ? ? ? ? //(3)同步請(qǐng)求網(wǎng)絡(luò) ? ? ? ? ? ? NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; ? ? ? ? ? ?? ? ? ? ? ? ? //(4)將數(shù)據(jù)寫(xiě)入文件 ? ? ? ? ? ? [self appendFile:data]; ? ? ? ? } ? ? ? ?? ? ? ? ? //3.切回主線程 ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{ ? ? ? ? ? ? //調(diào)用完成方法 ? ? ? ? ? ? done(); ? ? ? ? }); ? ? ? ?? ? ? }); }
3、獲取本地文件大?。?/strong>
/* ?獲取本地文件大小 ?*/ - (long long)getLocalFileLen{ ? ? //目錄路徑 ? ? NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; ? ? //文件路徑 ? ? NSString *filePath = [cacheDir stringByAppendingPathComponent:@"qq.dmg"]; ? ? //獲取本地文件NSDictionary信息 ? ? NSDictionary *map = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL]; ? ? //獲取本地文件大小,轉(zhuǎn)為longlong類型 ? ? return [map[NSFileSize] longLongValue]; }
4、將NSData數(shù)據(jù)追加寫(xiě)入文件:
/* ?將NSData數(shù)據(jù)追加寫(xiě)入文件 ?*/ - (void)appendFile:(NSData *)data{ ? ? //目錄路徑 ? ? NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; ? ? //文件路徑 ? ? NSString *filePath = [cacheDir stringByAppendingPathComponent:@"qq.dmg"]; ? ?? ? ? NSLog(@"filePath : %@", filePath); ? ?? ? ? //創(chuàng)建文件操作類,NSFileHandle支持追加寫(xiě)入方式 ? ? NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:filePath]; ? ?? ? ? if(!file){//文件不存在時(shí),直接覆蓋方式寫(xiě)入 ? ? ? ? [data writeToFile:filePath atomically:YES]; ? ? ? ? return; ? ? } ? ? //跳到文件末尾 ? ? [file seekToEndOfFile]; ? ?? ? ? //寫(xiě)數(shù)據(jù) ? ? [file writeData:data]; ? ?? ? ? //關(guān)閉文件流 ? ? [file closeFile]; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IOS開(kāi)發(fā)壓縮后圖片模糊問(wèn)題解決
這篇文章主要為大家介紹了IOS開(kāi)發(fā)壓縮后圖片模糊問(wèn)題解決實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07iOS開(kāi)發(fā)實(shí)現(xiàn)隨機(jī)圖片驗(yàn)證碼封裝
這篇文章主要介紹了iOS開(kāi)發(fā)實(shí)現(xiàn)隨機(jī)圖片驗(yàn)證碼封裝,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08IOS-MVC層讀取服務(wù)器接口JSON數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了IOS-MVC層讀取服務(wù)器接口JSON數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12iOS使用 CABasicAnimation 實(shí)現(xiàn)簡(jiǎn)單的跑馬燈(無(wú)cpu暴漲)
本篇文章主要介紹了iOS使用 CABasicAnimation 實(shí)現(xiàn)簡(jiǎn)單的跑馬燈(無(wú)cpu暴漲),具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01iOS之UIWebView無(wú)法獲取web標(biāo)題的解決方法
這篇文章主要為大家詳細(xì)介紹了iOS之UIWebView無(wú)法獲取web標(biāo)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07iOS高仿微信相冊(cè)界面翻轉(zhuǎn)過(guò)渡動(dòng)畫(huà)效果
在圖片界面點(diǎn)擊右下角的查看評(píng)論會(huì)翻轉(zhuǎn)到評(píng)論界面,評(píng)論界面點(diǎn)擊左上角的返回按鈕會(huì)反方向翻轉(zhuǎn)回圖片界面,真正的實(shí)現(xiàn)方法,與傳統(tǒng)的導(dǎo)航欄過(guò)渡其實(shí)只有一行代碼的區(qū)別,下面小編通過(guò)本文給大家介紹下ios高仿微信相冊(cè)界面翻轉(zhuǎn)過(guò)渡動(dòng)畫(huà)效果,一起看看吧2016-11-11