WQDownLoad
效果
用法
- 在AppDelegate中,在didFinishLaunchingWithOptions中实现
[[WQDownLoadManager shareInstance] applicationDidFinishLaunching];
- 下载单个信息
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];
}
}];
- 配置多选下载数据
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];
- 添加代理以获取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 文件。