WQDownLoad 0.2.0

WQDownLoad 0.2.0

hapii维护。



 
依赖关系
YYKit>= 0
AFNetworking>= 0
FMDB>= 0
SDWebImage>= 0
 

  • 作者
  • hapiii

WQDownLoad

CI Status Version License Platform Support

效果

效果图

用法

  1. 在AppDelegate中,在didFinishLaunchingWithOptions中实现
[[WQDownLoadManager shareInstance] applicationDidFinishLaunching];
  1. 下载单个信息
WQDownLoadModel *model = [[WQDownLoadModel alloc] init];
model.video_title = self.courseInfo.title;
model.video_id = self.courseInfo.video_id;
model.chapter_id = self.courseInfo.lessonID;
model.course_id = self.courseInfo.courseId;
model.user_id = @"userid12223";
model.video_parameter = @{};
model.create_time = [NSDate date];
model.cover_img_url = self.courseInfo.courseImgUrl;
model.course_name = self.courseInfo.courseTitle;
[[WQDownLoadManager shareInstance] addDownloadTaskWithTask:model errorHandle:^(BOOL success, NSString * _Nonnull errorMsg) {
    if (success) {
        [MBProgressHUD showSuccess:@"加入下载成功!" toView:self.viewController.view];
    }else {
        [MBProgressHUD showError:errorMsg toView:self.viewController.view];
    }
}];
  1. 配置多选下载数据
WQDownLoadChooseController *vc = [[WQDownLoadChooseController alloc] init];
NSString *sectionKey = self.couseInfo.IndexArr[section];
NSArray *arr = self.couseInfo.courses[sectionKey];
NSMutableArray *marr = @[].mutableCopy;
for (NSString *rowkey in arr) {
    WQCourseListInfoModel *lessionInfo = self.couseInfo.courseListPool[rowkey];
    WQDownLoadModel *model = [[WQDownLoadModel alloc] init];
    model.video_title = lessionInfo.title;
    model.video_id = lessionInfo.video_id;
    model.chapter_id = lessionInfo.lessonID;
    model.course_id = self.couseInfo.course_basic_info.global_id;
    model.user_id = @"userid12223";
    model.video_parameter = @{};
    model.create_time = [NSDate date];
    model.cover_img_url = self.couseInfo.course_basic_info.img_src;
    model.course_name = self.couseInfo.course_basic_info.title;
    [marr addObject:model];
}
vc.datas = marr.copy;
vc.title = sectionModel.title;
[self.viewController.navigationController pushViewController:vc animated:YES];
  1. 添加代理以获取WQDownLoadManagerDelegate下载进度及情况回调
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    [[WQDownLoadManager shareInstance] addListener:self];
    [self reloadData];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[WQDownLoadManager shareInstance] removeListener:self];
}

代理方法

- (void)downloadManagerDidPause:(WQDownLoadModel *)downloadTaskModel {
    [self reloadCellWithVideo:downloadTaskModel];
}

- (void)downloadManagerDidStart:(WQDownLoadModel *)downloadTaskModel {
    [self reloadCellWithVideo:downloadTaskModel];
}

- (void)downloadManagerDidReceiveBytes:(WQDownLoadModel *)downloadTaskModel {
    [self reloadCellWithVideo:downloadTaskModel];
}

- (void)downloadManagerDidFinish:(WQDownLoadModel *)downloadTaskModel {
    [self reloadCellWithVideo:downloadTaskModel];
    [self reloadData];
}

- (void)downloadManagerDidError:(WQDownLoadModel *)downloadTaskModel Error:(NSError *)error {
    [self reloadCellWithVideo:downloadTaskModel];
}

- (void)reloadCellWithVideo:(WQDownLoadModel *)video {
    WQDownLoadCell *cell = [self.tableView cellForRowAtIndexPath:self.videohash[video.engineKey]];
    cell.video = video;
}

cellHash配置,key为engineKey,value为index,便于reloadCell UI,如果tableView数据刷新,要再次重新配置

for (int i = 0; i < _datas.count; i++) {
    WQDownLoadModel *video = _datas[i];
    [_videohash setObject:[NSIndexPath indexPathForRow:i inSection:0] forKey:video.engineKey];
}

架构

  • 视频配套信息存储基于FMDB,
  • 下载实现基于NSURLSessionDataTask
  • audio airplay and picture in picture后台播放无声音频

WQDownLoadModel

为FMDB实体模型类,包含数据库要存储的数据以及部分getter属性,video_parameter参数用于扩展其他参数

WQDownLoadAudioPlayer

用于后台播放无声音频的管理器

  • 通过监控DidEnterBackground和WillEnterForeground来控制播放暂停

WQDownLoadModelDBManager

  • 数据库管理者
  • 封装了部分model更新
  • 下载数据获取

WQDownLoadSessionEngine

下载引擎,核心类

  • 视频下载video下载时的model信息
  • dataTask(task)下载任务dataTask(downloadTask)
  • 对外开放三个操作:开始、暂停、取消,以及供WQDownLoadSessionManager调用的下载进度和状态
  • 内部处理数据库的下载状态,并将下载信息实时回调给WQDownLoadManager

WQDownLoadSessionManager

NSURLSession管理者

  • 创建task
  • 将SessionDelegate分发给各个单独的Engine

WQDownLoadManager

任务调度、进度回调、核心类

  • 添加listener并将进度回调给listener
  • 任务管理(添加、删除、暂停)的单个操作或多个操作
  • applicationDidFinishLaunching进入app时恢复下载未完成的任务

TODO

  • downloadTask在下载时的数据库操作不理想,曾进行到一半,后来改用DataTask
  • didCompleteWithError之后重新创建一个task可能会导致无法暂停
  • 项目中没有直接提供下载URL,但下载时请求的URL有效期为 Ограничение временного окна,需要再次请求(与后台统一使用代码重新请求)

示例

要运行示例项目,请克隆仓库,并首先从示例目录运行 pod install

需求

安装

WQDownLoad 通过 CocoaPods 提供。安装它,只需将以下行添加到您的 Podfile 中

pod 'WQDownLoad'

作者

hapiii, [email protected]

许可证

WQDownLoad 在 MIT 许可证下提供。有关更多信息,请参阅 LICENSE 文件。