14、iOS后臺(tái)+斷點(diǎn)下載

iOS斷點(diǎn)+后臺(tái)下載

設(shè)計(jì)思路是根據(jù)寫一個(gè)通用控件的思路缓窜,iOS下載可以用的方式有很多管闷,像之前的URLConnection到現(xiàn)在的URLSession粥脚,本例用的是URLSession+URLSessionDownloadTask,斷點(diǎn)下載不止可以用這個(gè)DownloadTask包个,還可以用NSURLSessionDataTask,但是還要做到后臺(tái)下載的只有URLSessionDownloadTask

邏輯流程

1刷允、創(chuàng)建后臺(tái)session

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identify];
[NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

2、實(shí)現(xiàn)session代理

//session下載中的回調(diào)
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
//session下載完成后回調(diào)
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
//sessiontask任務(wù)結(jié)束后回調(diào)碧囊,就算是后臺(tái)下載树灶,或是異常退出,當(dāng)重新打開app時(shí)糯而,上次的下載任務(wù)還是會(huì)走這個(gè)回調(diào)天通,所以通過這里來完成后臺(tái)下載,包括后臺(tái)中斷下載在進(jìn)入前臺(tái)恢復(fù)
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

3熄驼、開始下載

    //主要是判斷有無之前的下載數(shù)據(jù)
    if (model.cqResumeData) {
        downloadTask = [self.session downloadTaskWithCorrectResumeData:model.cqResumeData];
    }else{
        downloadTask = [self.session downloadTaskWithURL:[NSURL URLWithString:model.cqDownloadUrl]];
    }

封裝思路

使用一個(gè)單例來管理所有的downloadtask像寒,并且只實(shí)例化一個(gè)后臺(tái)session來管理,這樣方便管理回調(diào)事件瓜贾,為每一個(gè)請(qǐng)求創(chuàng)建一個(gè)downloadFileModel來管理下載狀態(tài)诺祸,緩存。

首先從使用者角度上看分析出只需要如下功能阐虚,并且使用者只需要提供一個(gè)URL
1序臂、獲取下載模型 2、開始下載 3实束、暫停下載 4奥秆、取消下載

下載管理單例類
    //私有屬性
    @property (nonatomic, strong) NSURLSession *session;
    @property (nonatomic, strong) NSMutableDictionary *downloadTasks;
    @property (nonatomic, strong) NSMutableDictionary *downloadModels;
    //對(duì)外接口
    +(instancetype)shareManager;//獲取單例
    -(void)setUpSession;//初始化backgroundSession
    -(DownloadFileModel *)getModelByUrl:(NSString *)url;
    //下面幾個(gè)可以說對(duì)外,但其實(shí)還是對(duì)downloadModel開放的接口
    -(void)startDownloadWithURL:(NSString *)url;
    -(void)stopTaskWithUrl:(NSString *)url;
    -(void)cancelTaskWithURL:(NSString *)url;
下載任務(wù)模型
@property(nonatomic,strong) NSString *cqDownloadUrl;
@property(nonatomic,readonly) NSString *cqDownloadFilePath;
@property(nonatomic,strong) NSString *cqSessionTaskId;

@property(nonatomic,strong) NSData  *cqResumeData;
@property(nonatomic,assign) CGFloat cqProgress;
@property(nonatomic,assign) NSUInteger cqTotalLength;
@property(nonatomic,assign) NSUInteger cqCurrentDownloadLength;
@property(nonatomic,assign) DownloadType cqDownloadType;

-(instancetype)initWithUrl:(NSString *)url;
- (void)setCacheFile;
- (void)loadCacheFile;
- (void)checkDownload;
//用戶接口
@property(nonatomic,weak) id<NewDownloadFileDelegate> cqDelegate;
-(void)startDownloadTask;
-(void)stopDonwloadTask;
-(void)cancelDownloadTask;

使用方法:

1咸灿、 在appdelegate中調(diào)用[[DownloadFileManager shareManager]setUpSession];初始化session构订,為了是獲取之前下載中斷的下載任務(wù),和緩存的任務(wù)模型

2避矢、 后面再需要下載的地方通過DownloadFileModel *model = [[DownloadFileManager shareManager]getModelByUrl:url];獲取下載任務(wù)模型悼瘾,只能通過這種,獲取审胸,因?yàn)槿绻坝兄袛嗟娜蝿?wù)會(huì)通過這個(gè)方法重新獲取回來亥宿。

3、設(shè)置模型代理model.cqDelegate = self;

4砂沛、通過模型去執(zhí)行開始烫扼,暫停,取消操作
[model stopDonwloadTask];[model startDownloadTask];[model cancelDownloadTask];

5碍庵、通過代理方法監(jiān)聽模型下載狀態(tài)
-(void)downloadTaskModel:(DownloadFileModel *)taskModel StateChange:(DownloadType)type; -(void)downloadTaskModel:(DownloadFileModel *)taskModel Progress:(CGFloat)progress;

demo地址https://github.com/MartinOSix/DemoKit/tree/master/dOC/SingleFileDownload

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末映企,一起剝皮案震驚了整個(gè)濱河市悟狱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堰氓,老刑警劉巖挤渐,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異双絮,居然都是意外死亡浴麻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門掷邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白胀,“玉大人,你說我怎么就攤上這事抚岗。” “怎么了哪怔?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宣蔚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我认境,道長(zhǎng)胚委,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任叉信,我火速辦了婚禮亩冬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硼身。我一直安慰自己硅急,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布佳遂。 她就那樣靜靜地躺著营袜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丑罪。 梳的紋絲不亂的頭發(fā)上荚板,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音吩屹,去河邊找鬼跪另。 笑死,一個(gè)胖子當(dāng)著我的面吹牛煤搜,可吹牛的內(nèi)容都是我干的免绿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宅楞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼针姿!你這毒婦竟也來了袱吆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤距淫,失蹤者是張志新(化名)和其女友劉穎绞绒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榕暇,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓬衡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彤枢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狰晚。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缴啡,靈堂內(nèi)的尸體忽然破棺而出壁晒,到底是詐尸還是另有隱情,我是刑警寧澤业栅,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布秒咐,位于F島的核電站碘裕,受9級(jí)特大地震影響携取,放射性物質(zhì)發(fā)生泄漏帮孔。R本人自食惡果不足惜雷滋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一文兢、第九天 我趴在偏房一處隱蔽的房頂上張望晤斩。 院中可真熱鬧,春花似錦禽作、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萍程。三九已至幢妄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茫负,已是汗流浹背蕉鸳。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榕吼。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓勉失,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乱凿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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