您好,登錄后才能下訂單哦!
本篇文章描述下如何實現一個多文件下載任務管理的示例。
基本思路:向下載任務進行模型封裝
同時下載多個文件,將一個任務相關聯的所有數據對象封裝到一個模型對象中,方便管理
“下載任務”模型對象中的屬性封裝
1)下載任務的URL
@property (nonatomic, strong, readonly) NSURL * url;
2)下載任務的狀態
typedef enum { NMDownloaderStateDownload, //正在下載 NMDownloaderStateCompleted, //下載完成 NMDownloaderStatePause, //暫停下載 NMDownloaderStateFailed //下載失敗 }NMDownloaderState; @property (nonatomic, assign) NMDownloaderState state;
3)下載任務
@property (nonatomic, strong) NSURLSessionDownloadTask * dTask;
5)任務斷點信息
@property (nonatomic, strong) NSData * resumeData;
6)下載進度信息
@property (nonatomic, strong) NSProgress * progress;
“下載任務”封裝的方法
1)創建方法
+ (NMDownloader *)downloaderWithUrl:(NSURL *)url { return [[NMNetworkMusicDownloader alloc] initWithUrl:url]; } - (instancetype) initWithUrl:(NSURL *)url { if ( self = [super init] ) { //使用NSURLSession創建下載任務并啟動 //傳入progress并成為觀察者 } return self; }
2)觀察者響應方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { if( object ==self.progress && [keyPath isEqualToString:@"fractionCompleted"] ) { NSNumber * new = change[@"new"]; CGFloat n = new.doubleValue; //n即為當前的下載進度,可以通過代理將這個進度傳遞給UI元素以顯示 } }
3)下載控制器通過更改下載狀態實現,重寫setter方法
- (void)setState:(NMownloaderState)state { _state = state; if ( _state == NMDownloaderStateDownload ) {//下載 if ( self.resumeData != nil ) { //根據resumeData創建下載任務 } [self.dTask resume]; //開始下載 } else if ( _state == NMNetworkMusicDownloaderStatePause ) {//暫停 [self.dTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {//斷點 self.resumeData = resumeData; }]; } //可以使用代理/通知將下載任務狀態改變的信息通知到UI元素 }
定義下載任務管理類
管理類應當是一個單例對象
1)管理所有的下載任務
/** 下載任務數組 */ @property (nonatomic, strong) NSArray * downloaderArray;
2)提供方法添加/刪除下載任務
- (void) addDownloader:(NMNetworkMusicDownloader *) downloader; - (void) removeDownloader:(NMNetworkMusicDownloader*) downloader;
UI的顯示的說明
由于下載任務的UI顯示是需要實時更新的,將一個下載任務的顯示封裝成一個視圖對象
更新的數據包括:下載進度、下載狀態
"下載任務"模型對象,通過代理將下載進度、下載狀態的變化 傳遞給這個視圖對象,視圖對象更新UI
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。