本篇文章描述下如何實現(xiàn)一個多文件下載任務(wù)管理的示例。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),康樂企業(yè)網(wǎng)站建設(shè),康樂品牌網(wǎng)站建設(shè),網(wǎng)站定制,康樂網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,康樂網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
基本思路:向下載任務(wù)進行模型封裝
同時下載多個文件,將一個任務(wù)相關(guān)聯(lián)的所有數(shù)據(jù)對象封裝到一個模型對象中,方便管理
“下載任務(wù)”模型對象中的屬性封裝
1)下載任務(wù)的URL
@property (nonatomic, strong, readonly) NSURL * url;
2)下載任務(wù)的狀態(tài)
typedef enum { NMDownloaderStateDownload, //正在下載 NMDownloaderStateCompleted, //下載完成 NMDownloaderStatePause, //暫停下載 NMDownloaderStateFailed //下載失敗 }NMDownloaderState; @property (nonatomic, assign) NMDownloaderState state;
3)下載任務(wù)
@property (nonatomic, strong) NSURLSessionDownloadTask * dTask;
5)任務(wù)斷點信息
@property (nonatomic, strong) NSData * resumeData;
6)下載進度信息
@property (nonatomic, strong) NSProgress * progress;
“下載任務(wù)”封裝的方法
1)創(chuàng)建方法
+ (NMDownloader *)downloaderWithUrl:(NSURL *)url { return [[NMNetworkMusicDownloader alloc] initWithUrl:url]; } - (instancetype) initWithUrl:(NSURL *)url { if ( self = [super init] ) { //使用NSURLSession創(chuàng)建下載任務(wù)并啟動 //傳入progress并成為觀察者 } return self; }
2)觀察者響應(yīng)方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context { if( object ==self.progress && [keyPath isEqualToString:@"fractionCompleted"] ) { NSNumber * new = change[@"new"]; CGFloat n = new.doubleValue; //n即為當前的下載進度,可以通過代理將這個進度傳遞給UI元素以顯示 } }
3)下載控制器通過更改下載狀態(tài)實現(xiàn),重寫setter方法
- (void)setState:(NMownloaderState)state { _state = state; if ( _state == NMDownloaderStateDownload ) {//下載 if ( self.resumeData != nil ) { //根據(jù)resumeData創(chuàng)建下載任務(wù) } [self.dTask resume]; //開始下載 } else if ( _state == NMNetworkMusicDownloaderStatePause ) {//暫停 [self.dTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {//斷點 self.resumeData = resumeData; }]; } //可以使用代理/通知將下載任務(wù)狀態(tài)改變的信息通知到UI元素 }
定義下載任務(wù)管理類
管理類應(yīng)當是一個單例對象
1)管理所有的下載任務(wù)
/** 下載任務(wù)數(shù)組 */ @property (nonatomic, strong) NSArray * downloaderArray;
2)提供方法添加/刪除下載任務(wù)
- (void) addDownloader:(NMNetworkMusicDownloader *) downloader; - (void) removeDownloader:(NMNetworkMusicDownloader*) downloader;
UI的顯示的說明
由于下載任務(wù)的UI顯示是需要實時更新的,將一個下載任務(wù)的顯示封裝成一個視圖對象
更新的數(shù)據(jù)包括:下載進度、下載狀態(tài)
"下載任務(wù)"模型對象,通過代理將下載進度、下載狀態(tài)的變化 傳遞給這個視圖對象,視圖對象更新UI