ZXLUpload 1.0.9

ZXLUpload 1.0.9

zhangxiaolong 维护。



ZXLUpload 1.0.9

  • 作者:
  • zhangxiaolong

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]