NSURLSession:下載可斷點(diǎn)續(xù)傳

前言

  1. 無論是NSURLConnection還是NSURLSession要實(shí)現(xiàn)斷點(diǎn)續(xù)傳,原理都差不多:記錄下載位置,下次開始下載的時(shí)候帶著該位置請(qǐng)求網(wǎng)絡(luò)即可.
  2. 下面只介紹下NSURLSession的斷點(diǎn)續(xù)傳,文章末尾的demo里NSURLConnection和NSURLSession都實(shí)現(xiàn)了斷點(diǎn)續(xù)傳,大家可以自取.

封裝了一個(gè)類,演示下實(shí)現(xiàn)過程,上代碼

//
//  YYSessionVC.m
//  文件下載(可斷點(diǎn)續(xù)傳)
//
//  Created by yyMae on 16/1/21.
//  Copyright (c) 2016年 yyMae. All rights reserved.
//

#import "YYSessionVC.h"

@interface YYSessionVC ()<NSURLSessionDownloadDelegate>
//顯示下載進(jìn)度
@property (nonatomic, strong) UIProgressView *progressView;
@property (nonatomic, strong) UILabel *progressL;

@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;//下載任務(wù)
@property (nonatomic, strong) NSData *resumeData;//記錄下載位置
@property (nonatomic, strong) NSURLSession *session;

@property (nonatomic, strong) UIButton *button;
@end

@implementation YYSessionVC

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.title = @"NSURLSession";
    [self addView];
    //NSLog(@"%@",NSHomeDirectory());
}

- (void)addView{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(0, 0, 200, 20);
    button.center = CGPointMake(self.view.frame.size.width * 0.5, 250);
    [button setTitle:@"download" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(download1:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    self.button = button;
    UIProgressView *progressView = [[UIProgressView alloc]initWithFrame:CGRectMake(0, 0, 200, 20)];
    progressView.center = CGPointMake(self.view.frame.size.width * 0.5, 150);
    [self.view addSubview:progressView];
    self.progressView = progressView;
    UILabel *progressL = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 200, 20)];
    progressL.center = CGPointMake(progressView.center.x, 190);
    progressL.text = @"下載進(jìn)度:0.000000";
    [self.view addSubview:progressL];
    self.progressL = progressL;
}

/**
 *  session懶加載
 *
 *  @return session
 */
-(NSURLSession *)session{
    if (_session == nil) {
        //??????
        NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    }
    return _session;
}

//從0開始下載
- (void)start{
    //conerstone下載地址
    NSURL* url = [NSURL URLWithString:@"http://att4.weiphone.net/temp16/201405/06/7/Cornerstone_v2.7.10.dmg"];
    //創(chuàng)建下載任務(wù)
    self.downloadTask = [self.session downloadTaskWithURL:url];
    //開始任務(wù)
    [self.downloadTask resume];
}

//繼續(xù)下載
- (void)resume{
    //傳入上次暫停返回的數(shù)據(jù)
    self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
    //開始任務(wù)
    [self.downloadTask resume];
    
    self.resumeData = nil;
}

//暫停下載
- (void)pause{
    __weak typeof(self) selfVC = self;
    [self.downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
        selfVC.resumeData = resumeData;
        selfVC.downloadTask = nil;
    }];
}
- (void)download1:(UIButton *)sender{
    sender.selected = !sender.isSelected;
    if (nil == self.downloadTask) {
        if (self.resumeData) {//繼續(xù)下載
            [self.button setTitle:@"暫停" forState:UIControlStateNormal];
            [self resume];
        }else{//開始下載
            [self.button setTitle:@"暫停" forState:UIControlStateNormal];
            [self start];
        }
    }else{//暫停下載
        [self.button setTitle:@"繼續(xù)" forState:UIControlStateNormal];
        [self pause];
    }
}

#pragma mark -- NSURLSessionDownloadDelegate
/**
 *  下載完成調(diào)用
 *
 *  @param session
 *  @param downloadTask
 *  @param location     文件臨時(shí)地址
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    //獲取文件路徑
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    //剪切文件到路徑
    NSFileManager *fm = [NSFileManager defaultManager];
    [fm moveItemAtPath:location.path toPath:filePath error:nil];
    //提示下載完成
    [[[UIAlertView alloc]initWithTitle:@"下載完成" message:downloadTask.response.suggestedFilename delegate:self cancelButtonTitle:@"知道了" otherButtonTitles: nil] show];
}

/**
 *  每次寫入沙盒完畢調(diào)用
 *
 *  @param session
 *  @param downloadTask
 *  @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{
    //下載進(jìn)度
    self.progressView.progress = (double)totalBytesWritten / totalBytesExpectedToWrite;
    NSString *str = [NSString stringWithFormat:@"下載進(jìn)度:%f",(double)totalBytesWritten / totalBytesExpectedToWrite];
    self.progressL.text = str;
}

/**
 *  恢復(fù)下載時(shí)調(diào)用
 *
 *  @param session
 *  @param downloadTask
 *  @param fileOffset
 *  @param expectedTotalBytes
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
    
}

    

@end

demo下載地址
https://github.com/yyMae/download

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唇兑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该园,死亡現(xiàn)場(chǎng)離奇詭異倒彰,居然都是意外死亡责嚷,警方通過查閱死者的電腦和手機(jī)蚯瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門嘿期,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埋合,你說我怎么就攤上這事备徐。” “怎么了甚颂?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵坦喘,是天一觀的道長。 經(jīng)常有香客問我西设,道長瓣铣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任贷揽,我火速辦了婚禮棠笑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禽绪。我一直安慰自己蓖救,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布印屁。 她就那樣靜靜地躺著循捺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雄人。 梳的紋絲不亂的頭發(fā)上从橘,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音础钠,去河邊找鬼恰力。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旗吁,可吹牛的內(nèi)容都是我干的踩萎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼很钓,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼香府!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起码倦,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤企孩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叹洲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柠硕,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡工禾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年运提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝗柔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡民泵,死狀恐怖癣丧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栈妆,我是刑警寧澤胁编,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站鳞尔,受9級(jí)特大地震影響嬉橙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寥假,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一市框、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糕韧,春花似錦枫振、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雀扶,卻和暖如春杖小,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愚墓。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工窍侧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人转绷。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓伟件,卻偏偏與公主長得像,于是被迫代替她去往敵國和親议经。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斧账,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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