NSURLSession實(shí)現(xiàn)下載功能

最近做云盤項(xiàng)目,必不可少的就是下載上傳详幽,這里先介紹下載類的實(shí)現(xiàn)筛欢,不過沒有用多線程下載浸锨,還有很多不足的地方請(qǐng)大家指出更正。

@property (nonatomic, strong) NSURLSessionDownloadTask* downloadTask;

/**

*? resumeData記錄下載位置

*/

@property (nonatomic, strong) NSData* resumeData;

@property (nonatomic, strong) NSURLSession* session;//SESSION對(duì)象是肯定要有的

對(duì)session就是懶加載

- (NSURLSession *)session{

if (!_session) {

NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];

//這里的queue其實(shí)還可以進(jìn)一步細(xì)化版姑,不過項(xiàng)目很趕就沒做了柱搜,再加上使用了realm數(shù)據(jù)庫(kù),對(duì)于線程要求很高就不再深究剥险,有時(shí)間在回過頭來處理這個(gè)問題聪蘸。

_session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]]

}

return _session;

}

//開始下載的方法

/*

*? 從0開始下載

*/

- (void)startDownload{

NSURL *url = self.path.jq_URL;//這里用了分類,實(shí)際上就是將path轉(zhuǎn)URL表制,這里的Path就是文件的下載路徑

//創(chuàng)建請(qǐng)求

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

//下載請(qǐng)求的方式健爬,這個(gè)根據(jù)情況而定

[request setHTTPMethod:@"POST"];

//創(chuàng)建任務(wù),這個(gè)task是因?yàn)闀?huì)涉及到暫停夫凸,斷點(diǎn)續(xù)傳之類的要求

self.downloadTask = [self.session downloadTaskWithRequest:request];

//開始任務(wù)

[self.downloadTask resume];

}

/*

*? 暫停下載

*/

- (void)pause{

MJWeakSelf//這個(gè)是MJRefresh的weakSelf的宏定義

[self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {

//resumeData:包含了繼續(xù)下載的開始位置和下載的url

//斷點(diǎn)續(xù)傳不僅客戶端要做浑劳,還需要服務(wù)端進(jìn)行相應(yīng)的適配才行阱持。

weakSelf.resumeData = resumeData;

//置空task夭拌,resume的時(shí)候重新創(chuàng)建

weakSelf.downloadTask = nil;

}];

}

/*

*? 恢復(fù)下載

*/

- (void)resume{

//傳入暫停下載返回的數(shù)據(jù)

self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];

//開始恢復(fù)下載

[self.downloadTask resume];

//清空上次返回?cái)?shù)據(jù)

self.resumeData = nil;

}

//到這里已經(jīng)實(shí)現(xiàn)了基本的下載需求,不過對(duì)于項(xiàng)目肯定需要監(jiān)聽進(jìn)度及其他一系列東西衷咽,這里要求我們滿足NSURLSessionDownloadDelegate協(xié)議鸽扁,代理在config的時(shí)候已經(jīng)設(shè)置了

/**

*? 下載完畢會(huì)調(diào)用

*

*? @param location? ? 文件臨時(shí)地址

*/

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{

//保存至cache,方便清楚緩存

NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

// response.suggestedFilename : 建議使用的文件名镶骗,一般跟服務(wù)器端的文件名一致

NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];

// 將臨時(shí)文件剪切或者復(fù)制Caches文件夾

NSFileManager *mgr = [NSFileManager defaultManager];

// AtPath : 剪切前的文件路徑

// ToPath : 剪切后的文件路徑

[mgr moveItemAtPath:location.path toPath:file error:nil];

//關(guān)閉定時(shí)器,這個(gè)定時(shí)器是用來計(jì)算每秒的下載速度

[self.timer invalidate];

}

/**

*? 每次寫入沙盒完畢調(diào)用

*? 在這里面監(jiān)聽下載進(jìn)度桶现,totalBytesWritten/totalBytesExpectedToWrite

*

*? @param bytesWritten? ? ? ? ? ? ? 這次寫入的大小

*? @param totalBytesWritten? ? ? ? 已經(jīng)寫入沙盒的大小

*? @param totalBytesExpectedToWrite 文件總大小

*/

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{

//建議判斷是否存在同名文件,方法不在列舉

參數(shù)說明已經(jīng)介紹的很詳細(xì)鼎姊,具體要怎么操作根據(jù)實(shí)際需求做就好

self.spead += bytesWritten;//這里將開啟定時(shí)器骡和,計(jì)算速度

if (!self.isBegin) {

self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(calculateSpead) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:(NSRunLoopCommonModes)];

self.isBegin = YES;

}

}

- (void)calculateSpead{

NSLog(@"%@",self.spead);

self.spead = 0;//每秒清零一次

}

/**

*? 恢復(fù)下載后調(diào)用,

*/

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{

//根據(jù)實(shí)際需求相寇,在暫停后恢復(fù)下載可以做一定操作慰于。

}

//結(jié)束介紹,歡迎大家提出意見唤衫,給予更新婆赠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市佳励,隨后出現(xiàn)的幾起案子休里,更是在濱河造成了極大的恐慌,老刑警劉巖赃承,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妙黍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瞧剖,警方通過查閱死者的電腦和手機(jī)拭嫁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人噩凹,你說我怎么就攤上這事巴元。” “怎么了驮宴?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵逮刨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我堵泽,道長(zhǎng)修己,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任迎罗,我火速辦了婚禮睬愤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纹安。我一直安慰自己尤辱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布厢岂。 她就那樣靜靜地躺著光督,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塔粒。 梳的紋絲不亂的頭發(fā)上结借,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音卒茬,去河邊找鬼船老。 笑死,一個(gè)胖子當(dāng)著我的面吹牛圃酵,可吹牛的內(nèi)容都是我干的柳畔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼辜昵,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荸镊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堪置,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤躬存,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后舀锨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岭洲,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年坎匿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盾剩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雷激。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖告私,靈堂內(nèi)的尸體忽然破棺而出屎暇,到底是詐尸還是另有隱情,我是刑警寧澤驻粟,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布根悼,位于F島的核電站,受9級(jí)特大地震影響蜀撑,放射性物質(zhì)發(fā)生泄漏挤巡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一酷麦、第九天 我趴在偏房一處隱蔽的房頂上張望矿卑。 院中可真熱鬧,春花似錦沃饶、人聲如沸母廷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徘意。三九已至,卻和暖如春轩褐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玖详。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工把介, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蟋座。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓拗踢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親向臀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巢墅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容