ZXLUpload
背景:由于公司开发的App 文件上传数量控制在100个以内,而且部分功能不需要同步等待上传结果。视频需要压缩为.mp4格式,时长不能超过5分钟。(相信很多人看到这个背景就头疼,100个文件是啥玩意儿) 还是慢慢分析实现方法吧。
功能分析
1.等待多个文件上传任务成功后再进行下一步操作。(上传成功后再操作其他功能)
2.不需要等待多个文件上传任务成功就可以继续操作其他功能。(不等上传结果即可操作其他功能)
3.与单个文件上传任务共存。(这个任务的实现方式需要与单个文件上传方式一致)
4.断网后所有上传任务中断,恢复网络后所有任务继续。
5.App突然被关闭重启后可以继续中断的上传任务。
6.上传成功的文件不重复上传,减少流量损耗、提高上传速度、提高上传成功率。
7.在相同任务中有相同文件正在等待上传结果时,同步上传进度、文件信息。(如果需要视频压缩,做法类似)
8.控制视频压缩的数量。
9.控制文件上传的数量。(目前我使用的阿里云上传库已经解决了此问题)
10.控制内存、CPU等性能。
暂时就分析到这里吧
实现思路
1.准备工作
1.1、文件上传实现,(ZXLAliOSSManager)公司目前的服务器都在阿里云上,所以上传也使用阿里云,我只是简单实现了一个上传封装。
1.2、文件信息model、任务信息model。(ZXLFileInfoModel、ZXLTaskInfoModel)
1.3、文件处理工具(ZXLFileUtils)、图片处理工具(ZXLPhotosUtils)、视频处理工具(ZXLVideoUtils)、存储管理包括沙盒和数据库(ZXLDocumentUtils和ZXLUploadFmdb)。
1.4、上传结果增、删、改、查。(ZXLUploadFileResultCenter)
1.5、网络环境和状态监控。(ZXLReachability、ZXLNetworkManager)
2.实现过程
2.1、上传管理中心。(ZXLUploadFileManager)处理任务文件上传和非任务文件上传。
2.2、上传任务管理中心。(ZXLUploadTaskManager)
3.线程安全考虑,针对数组(ZXLSyncMutableArray)、字典(ZXLSyncMutableDictionary)等做线程安全。
4.性能考虑。
4.1、压缩性能考虑。(ZXLCompressManager、ZXLCompressOperation)
4.2、上传性能考虑。(阿里云上传库里面解决了此问题、如果用的是七牛的库可以参考压缩能考虑的做上传处理)
关于ZXLUpload的使用
创建文件模型 1.1 创建相册文件模型 ZXLFileInfoModel *model = [[ZXLFileInfoModel alloc] initWithAsset:asset];
1.2 创建拍摄的图片
如果图片不大或已编辑过的图片
ZXLFileInfoModel *model = [[ZXLFileInfoModel alloc] initWithImage:image];
拍摄的原图(内部对图片做了处理)
ZXLFileInfoModel *model = [[ZXLFileInfoModel alloc] initWithUIImagePickerControllerImage:image];
1.3 创建拍摄的视频或路径文件
ZXLFileInfoModel *model = [[ZXLFileInfoModel alloc] initWithFileURL:filePath];
文件上传 2.1 等待上传结果
[JLBAsyncUploadTaskManager startUploadForIdentifier:self.uploadIdentifier complete:^(ZXLTaskInfoModel *taskInfo) { if (taskInfo) { [self submitFinishWithTaskInfo:taskInfo]; } }];
[[ZXLUploadTaskManager manager] startUploadWithUnifiedResponeseForIdentifier:self.uploadIdentifier];
//处理中心在Dome ZXLUploadUnifiedResponese+Exension 文件中 -(void)extensionUnifiedResponese:(ZXLTaskInfoModel *)taskInfo 函数中
如果有任何疑问,可以留言或者发邮件[email protected]