iOS 中視頻下載的斷點續(xù)傳

? ? ? ?最近項目中遇到一個需求:在視頻下載的時候能夠暫停保存统抬,能夠顯示下載進度匪蝙,在下次進入界面的時候后能夠繼續(xù)下載窟感,要求顯示已下載的百分比;列表內能同時下載多個視頻文件鲤嫡。思路如下:

????????1送挑、在執(zhí)行下載任務時,獲取本次下載文件大小暖眼,下載一部分的同時寫入到本地文件中惕耕,動態(tài)顯示下載進度。


? ? ? ? 2诫肠、暫停下載司澎。



? ? ? ? 3、繼續(xù)下載任務区赵,獲取本地已下載文件大小惭缰。獲取繼續(xù)下載的任務的文件大小。 ?



?#import "DownloadHandle.h"

@interface? DownloadHandle ()

@property (nonatomic , copy) NSString? *? downloadCompletePath;//下載完成路徑

@property (nonatomic , strong) NSOutputStream * outputStream;//輸出流笼才;

@property (nonatomic , assign) NSInteger currentLength;//當前下載的長度

@property (nonatomic , assign) NSInteger totalLength;//全部下載長度

@property (nonatomic , copy)void(^completeFn)(NSError * error);

@property (nonatomic , copy)void(^recieveFn)(CGFloat progress);

@end

@implementation DownloadHandle

-(void)dealloc

{

? ? [self.dataTask suspend];

? ? self.dataTask = nil;

? ? [self.outputStream close];

? ? self.outputStream = nil;

}

/**

初始化函數(shù)

@param url 下載地址

@param filePath 文件名

@param recieveFn 接受到數(shù)據(jù)的回調

@param completeFn 下載完成后的回調

@return 實例對象

*/

-(instancetype)initWithUrl:(NSString *)url

? ? ? ? ? ? ? ? ? filePath:(NSString *)filePath

? ? ? ? ? ? ? ? recieveFn:(void(^)(CGFloat progress))recieveFn

? ? ? ? ? ? ? ? completeFn:(void(^)(NSError *error))completeFn

{

? ? if(self = [super init])

? ? {

? ? ? ? _url = url;

? ? ? ? self.downloadCompletePath = filePath;

? ? ? ? self.completeFn = completeFn;

? ? ? ? self.recieveFn = recieveFn;

? ? ? ? NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];

? ? ? ? NSInteger currentDataSize = [self getCurrentDataSize];

? ? ? ? NSString * range = [NSString stringWithFormat:@"bytes=%zd-",currentDataSize];

? ? ? ? if(currentDataSize != 0)

? ? ? ? ? ? _currentLength = currentDataSize;

? ? ? ? request.timeoutInterval = 0;

? ? ? ? [request setValue:range forHTTPHeaderField:@"Range"];

? ? ? ? self.dataTask = [self.session dataTaskWithRequest:request];

? ? ? ? [self.dataTask resume];

? ? }

? ? return self;

}

/**

暫停下載

*/

-(void)pauseDownload

{

? ? [self.dataTask suspend];

}

/**

繼續(xù)下載

@param recieveFn 繼續(xù)下載以后的回調

@param completeFn 下載完成的回調

*/

-(void)continueDownloadWithRecieveFn:(void(^)(CGFloat progress))recieveFn

? ? ? ? ? ? ? ? ? ? ? ? ? completeFn:(void(^)(NSError *error))completeFn

{

? ? _recieveFn = recieveFn;

? ? _completeFn = completeFn;

? ? if(self.dataTask )

? ? {

? ? ? ? NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:_url]];

? ? ? ? NSInteger currentDataSize = [self getCurrentDataSize];

? ? ? ? NSString * range = [NSString stringWithFormat:@"bytes=%zd-",currentDataSize];

? ? ? ? if(currentDataSize != 0)

? ? ? ? ? ? _currentLength = currentDataSize;

? ? ? ? request.timeoutInterval = 0;

? ? ? ? [request setValue:range forHTTPHeaderField:@"Range"];

? ? ? ? self.dataTask = [self.session dataTaskWithRequest:request];

? ? ? ? [self.dataTask resume];

? ? }

}

/**

停止下載

*/

-(void)stopDownload

{

? ? [self.dataTask suspend];

? ? self.dataTask = nil;

? ? [self.outputStream close];

? ? self.outputStream = nil;

}

/**

獲取當前已下載的長度

@return 已下載的長度

*/

-(NSInteger)getCurrentDataSize

{

? ? NSFileManager * manager = [NSFileManager defaultManager];

? ? NSDictionary * dict = [manager attributesOfItemAtPath:self.downloadCompletePath error:nil];

? ? NSInteger size = [dict[@"NSFileSize"] integerValue];

? ? self.currentLength = size;

? ? return size;

}

/**

獲取當前下載進度百分比

@return 下載進度

*/

-(CGFloat)getCurrentProgress

{

? ? CGFloat progress = [self getCurrentDataSize] * 1.0 /self.totalLength;

? ? return progress;

}

#pragma mark ----------- NSURLSessionDownloadDelegate ----------

//

- (void)URLSession:(NSURLSession *)session

? ? ? ? ? dataTask:(NSURLSessionDataTask *)dataTask

didReceiveResponse:(NSHTTPURLResponse *)response

completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{

? ? NSLog(@"接收到服務器的響應");

? ? NSLog(@"預期長度:%lld",response.expectedContentLength);

? ? self.totalLength = response.expectedContentLength + _currentLength;;

? ? //創(chuàng)建寫入流

? ? NSURL * path = [NSURL fileURLWithPath:self.downloadCompletePath];

? ? NSOutputStream * stream = [NSOutputStream outputStreamWithURL:path append:YES];

? ? [stream open];

? ? self.outputStream = stream;

? ? completionHandler(NSURLSessionResponseAllow);

}

//接受到數(shù)據(jù)后的回調 會多次回調

-(void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data

{

? ? self.currentLength += data.length;

? ? NSInteger downloadLength =? [self.outputStream write:data.bytes maxLength:data.length];

? ? CGFloat progress = 1.0 *self.currentLength / self.totalLength * 100;

? ? NSLog(@"下載了百分比---->%f %% 下載文件大小%ld,文件總大小:%ld,本地寫入的文件大新缭洹:%ld", progress,self.currentLength,self.totalLength,downloadLength);

? ? self.recieveFn(progress);

}

//下載完成

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

{

? ? [self.outputStream close];

? ? self.outputStream = nil;

? ? self.completeFn(error);

}

#pragma mark -------------------------懶加載--------------------------------

-(NSURLSession *)session

{

? ? if(!_session)

? ? {

? ? ? ? NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];

? ? ? ? _session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];

? ? }

? ? return _session;

}

@end

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末骡送,一起剝皮案震驚了整個濱河市昂羡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摔踱,老刑警劉巖虐先,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異派敷,居然都是意外死亡蛹批,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門篮愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腐芍,“玉大人,你說我怎么就攤上這事试躏≈碛拢” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵颠蕴,是天一觀的道長泣刹。 經(jīng)常有香客問我,道長犀被,這世上最難降的妖魔是什么椅您? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮寡键,結果婚禮上襟沮,老公的妹妹穿的比我還像新娘。我一直安慰自己昌腰,他們只是感情好开伏,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遭商,像睡著了一般固灵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劫流,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天巫玻,我揣著相機與錄音,去河邊找鬼祠汇。 笑死仍秤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的可很。 我是一名探鬼主播诗力,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼我抠!你這毒婦竟也來了苇本?” 一聲冷哼從身側響起袜茧,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓣窄,沒想到半個月后笛厦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡俺夕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年裳凸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劝贸。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姨谷,死狀恐怖,靈堂內的尸體忽然破棺而出悬荣,到底是詐尸還是另有隱情菠秒,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布氯迂,位于F島的核電站践叠,受9級特大地震影響,放射性物質發(fā)生泄漏嚼蚀。R本人自食惡果不足惜禁灼,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轿曙。 院中可真熱鬧弄捕,春花似錦、人聲如沸导帝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽您单。三九已至斋荞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虐秦,已是汗流浹背平酿。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悦陋,地道東北人蜈彼。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像俺驶,于是被迫代替她去往敵國和親幸逆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容