下載管理器封裝

在這里需要兩對文件

1.在第一個.h文件內(nèi)寫兩個Block參數(shù)和一個代理協(xié)議

第一個參數(shù):正在下載

typedef void (^Downloading)(long long bytesWritten,float progress);

第二個參數(shù):下載完成

typedef void (^Complete)(NSString *filePath,NSString *url);

自寫代理協(xié)議及方法

@protocol DownloadDelegate<NSObject>

- (void)didFinishDownload:(NSString *)url

@end

@interface Download :NSObject

設置你聲明的代理屬性

@property (nonatomic,weak)id<DownloadDelegate>delegate;

?自定義init方法,在初始化的時候就去創(chuàng)建一個下載任務

- (instancetype)initWithUrl:(NSString *)url;

?開始下載

- (void)startDownload;

?暫停下載

- (void)stopDownload;

?下載的時候和下載完成會走其中的Block

- (void)downloading:(Downloading)downloading didFinished:(Complete)Complete;

@end

2.在第一個.m文件內(nèi)實現(xiàn)這些方法

在這里會使用NSURLSession下的一些方法

#import "Download.h"

遵守一個代理

@interface Download ()<NSURLSessionDownloadDelegate>

聲明屬性

@property (nonatomic,strong) NSURLSession *session;

下載任務

@property (nonatomic,strong) NSURLSessionDownloadTask *task;?

正在下載

@property (nonatomic, copy)Downloading downloading;

下載完成

@property (nonatomic,strong) Complete complete;

@end

@implementation Download

寫個懶加載

- (NSURLSession *)session{

? ? if (!_session){

_session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]delegate:self delegateQueue:nil];

? ? }

?return _session;

}

自定義init方法,在初始化的時候就去創(chuàng)建一個下載任務

- (instancetype)initWithUrl:(NSString *)url{

? ? if ([super init]) {

? ? ? // 創(chuàng)建一個下載任務

? ? ? self.task = [self.session downloadTaskWithURL:[NSURL URLWithString:url]];

? ? }

return self;

}

開始下載

- (void)startDownload{

? ? [self.task resume];

}

暫停下載

- (void)stopDownload{

[self.task suspend];

}

正在下載

這是NSURLSession自帶的一個方法慌随,里面的參數(shù)downloadTask:下載任務角雷,didWriteData:寫入數(shù)據(jù),totalBytesWritten:已經(jīng)寫入總的數(shù)據(jù),totalBytesExpectedToWrite:預計寫的總數(shù)據(jù)

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

?if (self.downloading){

self.downloading(bytesWritten,100*totalBytesWritten/(float)totalBytesExpectedToWrite);

? ?}

下載完成

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {

// 我們要存放下載文件的路徑

NSString *filePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;

// 拼接文件的名字,名字是從服務器上獲取下來的

NSString *fileName = downloadTask.response.suggestedFilename;

filePath = [filePath stringByAppendingPathComponent:fileName];

// 文件管理器慎菲,把臨時的文件移動到緩存文件夾下

[[NSFileManager defaultManager] moveItemAtPath:location.path toPath:filePath error:nil];

NSLog(@"%@",filePath);

if (self.complete) {

self.complete(filePath,@"網(wǎng)址");

? ?}

下載的時候和下載完成會走其中的Block

- (void)downloading:(Downloading)downloading didFinished:(Complete)Complete {

self.downloading = downloading;

self.complete = Complete;

}

第二個文件的.h內(nèi)

#import<Foundation/Foundation.h>

@interface DownloadCoreData : NSObject

+ (instancetype)sharedManager;

- (Download *)addDownloadWithUrl:(NSString *)url;

- (Download *)findDownloadWithUrl:(NSString *)url;

- (void)didFinishDownload:(NSString *)url;

@end

第二個文件的.m內(nèi)

#import "DownloadCoreData.h"

遵守上個文件寫的代理

@interface DownloadCoreData ()<DownloadDelegate>

聲明一個字典屬性

@property (nonatomic,strong)NSMutableDictionary *dic;

@end

@implementation DownloadCoreData

懶加載

- (NSMutableDictionary *)dic{

? if (!_dic) {

_dic = [NSMutableDictionary dictionary]; ?

? ? }

return _dic;

}

GCD單例

+ (instancetype)sharedManager {

static DownloadCoreData *handle = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

handle = [[DownloadCoreData alloc]init];

? ?});

return handle;

}

- (Download *)addDownloadWithUrl:(NSString *)url {

Download *download = [[Download alloc]initWithUrl:url];

download.delegate = self;

[download startDownload];

[self.dic setObject:download forKey:url];

return download;

? }

- (Download *)findDownloadWithUrl:(NSString *)url {

return self.dic[url];

}

- (void)didFinishDownload:(NSString *)url {

[self.dic removeObjectForKey:url];

}

@end

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末框喳,一起剝皮案震驚了整個濱河市课幕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌五垮,老刑警劉巖乍惊,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異放仗,居然都是意外死亡润绎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門诞挨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莉撇,“玉大人,你說我怎么就攤上這事惶傻〖诠常” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵达罗,是天一觀的道長坝撑。 經(jīng)常有香客問我静秆,道長,這世上最難降的妖魔是什么巡李? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任抚笔,我火速辦了婚禮,結果婚禮上侨拦,老公的妹妹穿的比我還像新娘殊橙。我一直安慰自己,他們只是感情好狱从,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布膨蛮。 她就那樣靜靜地躺著,像睡著了一般季研。 火紅的嫁衣襯著肌膚如雪敞葛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天与涡,我揣著相機與錄音惹谐,去河邊找鬼。 笑死驼卖,一個胖子當著我的面吹牛氨肌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酌畜,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怎囚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了桥胞?” 一聲冷哼從身側(cè)響起桩了,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埠戳,沒想到半個月后井誉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡整胃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年颗圣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁使。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淘钟,死狀恐怖炭庙,靈堂內(nèi)的尸體忽然破棺而出腌闯,到底是詐尸還是另有隱情驮吱,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布酬蹋,位于F島的核電站及老,受9級特大地震影響抽莱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骄恶,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一食铐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧僧鲁,春花似錦虐呻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至春寿,卻和暖如春朗涩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堂淡。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扒腕,地道東北人绢淀。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像瘾腰,于是被迫代替她去往敵國和親皆的。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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