色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>通訊/手機編程>

封裝下載管理器實例教學

大小:0.3 MB 人氣: 2017-09-26 需要積分:1

  第一節:功能說明

  首先,本篇文章教大家寫一個最簡單的下載管理器,不包含上傳管理器。不過,上傳管理器與下載管理器是一樣的,后面會拋磚引玉,大家可以各自去嘗試!

  本篇文章所講解的下載管理器具備以下功能:

  開始下載某個視頻

  掛起某個視頻下載(暫停下載)

  恢復某個視頻下載(繼續下載)

  可設置下載最大并發量

  添加到下載隊列

  以下便是最基本的功能了,那么我們就根據這幾個基本功能來實現。至于要做到后臺自動下載及退出App,下次進入再自動恢復到上一次退出的狀態的,這些不在本demo范圍之內!

  為了demo的簡單,一切從簡!

  第二節:設計理念

  設計理念通常都希望簡單使用且易擴展易維護

  與具體的下載類型無關,比如不管是視頻下載還是音頻下載又或是普通文件下載,都沒有關系,都可通用

  單個下載應保持功能的單一性,專心做一件事

  第三節:如何設計整個下載管理器

  考慮到需要記錄進度及狀態,所以一旦開啟下載,整個app過程中都會存在,可考慮使用單例,也可以考慮非單例,但是非單例模式也得保證只創建一遍并交給appDelegate持有,其實與單例設計相當的。為了簡化,這里采用的是單例設計。所以,下載管理器以單例形式存在。

  考慮到需要處理并發下載問題,因此使用NSOperationQueue

  考慮到下載類的功能單一性,采用子類化NSOperation

  考慮到使用下載功能與文件類型無關,可定義協議,使model必須遵守,比如豆瓣開源的DOUAudioStreamer就是采用這種方式來實現

  但是,為了demo的簡單,這里沒有定義協議,直接使用model了。大家可以在真正設計時,采用協議的式,以支持任意model。筆者在項目中真正去寫的時候,也會采用協議的方式,支持下載、上傳做任意類型的文件,包括視頻、音頻等。

  本demo中,主要設計以下幾個類:

  HYBVideoOperation:子類化的NSOperation,用于專門做下載

  HYBVideoModel:視頻下載數據模型,包括視頻下載地址、存儲地址、進度、狀態等,并持有HYBVideoOperation,以方便管理

  HYBVideoManager:下載管理器,管理所有的HYBVideoModel

  然后,我們還需要與UI交互,所以在cell中需要model。HYBVideoCell類為cell,強引用model!

  那么,這整個交互是這樣的:

  HYBVideoManager —–》管理所有的HYBVideoModel

  每個HYBVideoModel—–》持有一個HYBVideoOperation

  HYBVideoOperation—-》弱持有一個HYBVideoModel

  HYBVideoCell —–》持有一個HYBVideoModel,當進度或狀態變化時,更新UI

  所設計的回調全放在HYBVideoModel中,當HYBVideoModel的進度屬性值和狀態值發生變化時反饋到UI變化上!

  第四節:子類化NSOperation

  關于子類化NSOperation需要做哪些事件,最好還是先閱讀筆者之前所寫的一篇文章NSOperation/Queue,不過下面我也會列出一些要點:

  重寫start方法時,要做好isCannelled的判斷

  重寫isExecuting、isFinished、isConcurrent

  重寫cancel,并處理好isCancelled KVO處理

  我們設計Operation時,采用NSURLSession實現下載,通過控制NSURLSessionDownloadTask,可實現下載、暫停下載和斷點下載功能。

  我們整個頭文件的設計為:

  @class HYBVideoModel;

  @interface NSURLSessionTask (VideoModel)

  // 為了更方便去獲取,而不需要遍歷,采用擴展的方式,可直接提取,提高效率

  @property (nonatomic, weak) HYBVideoModel *hyb_videoModel;

  @end

  @interface HYBVideoOperation : NSOperation

  - (instancetype)initWithModel:(HYBVideoModel *)model session:(NSURLSession *)session;

  @property (nonatomic, weak) HYBVideoModel *model;

  // 可以不公開此屬性

  @property (nonatomic, strong, readonly) NSURLSessionDownloadTask *downloadTask;

  - (void)suspend;

  - (void)resume;

  - (void)downloadFinished;

  @end

  這里還擴展了NSURLSessionTask,將模型與之關聯,注意采用弱引用哦!我不知道這樣設計是否合理,但是我個人認為這么設計的好處是:接口簡單,與外部沒有直接的聯系,session來源于下載管理類,這樣可統一管理。

  當下載完成之后,一定要回調downloadFinished,目的是讓任務退隊。要讓任務退隊,只有保證isFinished為YES才能退隊!

  [self willChangeValueForKey:@“isFinished”];

  [self willChangeValueForKey:@“isExecuting”];

  _executing = NO;

  _finished = YES;

  [self didChangeValueForKey:@“isExecuting”];

  [self didChangeValueForKey:@“isFinished”];

  因為任務完成還可以重新下載,通常情況下不會自動退隊。

  第五節:反饋到UI展示進度及狀態提示

  我們通過模型來反饋到UI上,在進度和狀態變化時,可以回調來更新UI。

  首先,下載過程有很多種狀態,我們定義成枚舉:

  typedef NS_ENUM(NSInteger, HYBVideoStatus) {

  kHYBVideoStatusNone = 0, // 初始狀態

  kHYBVideoStatusRunning = 1, // 下載中

  kHYBVideoStatusSuspended = 2, // 下載暫停

  kHYBVideoStatusCompleted = 3, // 下載完成

  kHYBVideoStatusFailed = 4, // 下載失敗

  kHYBVideoStatusWaiting = 5 // 等待下載

  };

  設計屬性:

  typedef void(^HYBVideoStatusChanged)(HYBVideoModel *model);

  typedef void(^HYBVideoProgressChanged)(HYBVideoModel *model);

  @interface HYBVideoModel : NSObject

  @property (nonatomic, copy) NSString *videoId;

  @property (nonatomic, copy) NSString *videoUrl;

  @property (nonatomic, copy) NSString *imageUrl;

  @property (nonatomic, copy) NSString *title;

  // 用于斷點下載記錄,其實應該要存儲到文件中,然后記錄路徑,但是為了簡單,demo就不這么做了

  @property (nonatomic, strong) NSData *resumeData;

  // 下載后存儲到此處

  @property (nonatomic, copy) NSString *localPath;

  @property (nonatomic, copy) NSString *progressText;

  // 非常關鍵的屬性,進度變化會自動回調onProgressChanged

  @property (nonatomic, assign) CGFloat progress;

  // 狀態變化會自動回調onStatusChanged

  @property (nonatomic, assign) HYBVideoStatus status;

  // 這里為什么要引用operation且是強引用?因為管理器直接管理的是model,

  // 而真正做下載任務的是operation。

  // 為什么沒有將這兩個分別作為屬性呢?為了整體更簡單!

  @property (nonatomic, strong) HYBVideoOperation *operation;

  @property (nonatomic, copy) HYBVideoStatusChanged onStatusChanged;

  @property (nonatomic, copy) HYBVideoProgressChanged onProgressChanged;

  @property (nonatomic, readonly, copy) NSString *statusText;

  @end

  當然,不同的人來設計,可能會有不同的方式。我分析過好幾種設計方式,但是列出來的好處,不如這一種。

  當進度或者狀態變化時,自動地回調:

  - (void)setProgress:(CGFloat)progress {

  if (_progress != progress) {

  _progress = progress;

  if (self.onProgressChanged) {

  self.onProgressChanged(self);

  } else {

  NSLog(@“progress changed block is empty”);

  }

  }

  }

  - (void)setStatus:(HYBVideoStatus)status {

  if (_status != status) {

  _status = status;

  if (self.onStatusChanged) {

  self.onStatusChanged(self);

  }

  }

  }

  這樣回調與下載管理類及下載類都沒有直接的關系了,而model的回調直接反饋到UI層了!

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 九九热这里只有精品2| 国产精品爽黄69天堂A片| 久久久精品免费视频| 中文无码熟妇人妻AV在线| 麻豆精品一区二正一三区| 最新国产麻豆精品| 热99re久久精品国产首页| 大桥未久与黑人中出视频| 玩高中女同桌肉色短丝袜脚文| 国产精品嫩草久久久久| 亚洲欧洲精品A片久久99| 久久精品国产96精品亚洲| 99久久国产露脸国语对白| 天美麻豆成人AV精品| 精品在线观看一区| zxfuli午夜福利在线| 亚洲精品无码久久久久A片空| 麻豆COMCN| 国产手机在线亚洲精品观看| 最近中文字幕高清中文字幕MV| 色久久一个亚洲综合网| 久久国产香蕉视频| 国产99视频精品一区| 131美女爱做视频午夜剧场| 性做久久久久久久久浪潮| 男人插曲视频大全免费网站| 国产伊人久久| 被吊起玩弄的女性奴| 在线日本v二区不卡| 性欧美金发洋妞xxxxbbbb| 任你懆视频 这里只有精品| 免费的av不用播放器的| 九九99亚洲精品久久久久| 国产精品毛片在线视频| SAO货腿张开JI巴CAO死我| 97人妻中文字幕免费视频| 一区二区三区国产| 亚洲乱码高清午夜理论电影| 午夜色情影院色a国产| 小泽玛丽av无码观看| 亚洲AV 中文字幕 国产 欧美|