今天项目经理说了数据库下载的时候只显示文件从小到大增加太空洞,需要增加百分比显示。那好吧,自己搞。 我也知道网上有demo,但是就想自己研究,而且我用的是AF3.0 ,可能很多方法都过时了。
1.获取文件总大小
获取文件总大小,我觉得AF既然是封装了系统的URLSession,那它肯定是用了系统的方法来做的。于是我用total
去AFURLSessionManager
寻找,果然找到三个方法,分别是
- (void)setTaskDidSendBodyDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block;
- (void)setDownloadTaskDidWriteDataBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block;
- (void)setDownloadTaskDidResumeBlock:(nullable void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block;
从字面意思来看,明显第一个是文件上传的方法,最后一个是断点下载的方法,那就只有中间那个是我们需要的了。
2.计算百分比
你以为计算完百分比就完事了? 我也是这么以为的。
结果只有totalBytesWritten
的值是不断增大的,totalBytesExpectedToWrite
这个一直都是-1, 这尼玛就很尴尬了,这是系统的方法呀。
然后我随手把这个词复制到搜索框,果然又一次是stackoverflow救了我,大概意思就是因为HTTP自己也不知道这个东西有多大,因为他的文件类型是未知的,需要给HTTP添加表头
[request addValue:@"User-Agent" forHTTPHeaderField:@"Accept-Encoding"];
注意:这里的value 是你自己下载完成后NSURLResponse
返回的参数,不是随便写的。
3.最后
添加完成表头以后,我一直以为没用的downloadProgress
直接给我输出结果了,所以我直接删除了前面添加的这个方法,直接在这里写我需要的操作就可以了。
网友评论